RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 706973
Accepted
pepel_xD
pepel_xD
Asked:2020-08-17 14:07:09 +0000 UTC2020-08-17 14:07:09 +0000 UTC 2020-08-17 14:07:09 +0000 UTC

嵌套集的树生成

  • 772

实现一个drawNestedSetsTree(data, node)将两个参数作为输入的函数:

  • data- 一个或多个节点的数组0,其中每个元素都包含字段

    • title(主机名),

    • left(左边框)和

    • right(右边框)。

    存储格式 - 嵌套集

  • node- DOM节点(你可以认为它会是div),你需要在其中以树的形式展示最终的结构ul和li

该函数drawNestedSetsTree()将位于数据中的树的可视化输出到传递的 DOM 节点。

输入数组数据和函数结果如下所示:

[
  {
    title: "Одежда",
    left: 1,
    right: 22
  },
  {
    title: "Мужская",
    left: 2,
    right: 9
  },
  {
    title: "Женская",
    left: 10,
    right: 21
  },
  {
    title: "Костюмы",
    left: 3,
    right: 8
  },
  {
    title: "Платья",
    left: 11,
    right: 16
  },
  {
    title: "Юбки",
    left: 17,
    right: 18
  },
  {
    title: "Блузы",
    left: 19,
    right: 20
  },
  {
    title: "Брюки",
    left: 4,
    right: 5
  },
  {
    title: "Жакеты",
    left: 6,
    right: 7
  },
  {
    title: "Вечерние",
    left: 12,
    right: 13
  },
  {
    title: "Летние",
    left: 14,
    right: 15
  }
];
<ul>
  <li>Одежда
    <ul>
      <li>Мужская
        <ul>
          <li>Костюмы
            <ul>
              <li>Брюки</li>
              <li>Жакеты</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>Женская
        <ul>
          <li>Платья
            <ul>
              <li>Вечерние</li>
              <li>Летние</li>
            </ul>
          </li>
          <li>Юбки</li>
          <li>Блузы</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

对解决此类问题的算法感兴趣。

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    zzzoryn
    2020-08-25T00:22:58Z2020-08-25T00:22:58Z

    Nested Sets - 一种存储目录树的格式,每个目录树包含左右一对列,存储所有嵌套元素的范围,例如,9个元素的树的根会有一个左值'' 1'' 和正确的值 ''18'' 。

    链接到维基。

    这是一个示例,说明如何根据您的任务使用 NS 数据在 JS 中呈现嵌套的 HTML 列表:

    /**
      * Функция принимает 2 значения:
      * @param data - массив Nested Sets
      * @param node - DOM элемент
      */
    function drawNestedSetsTree(data, node) {
      node.innerHTML = ''; // Очищаем от дочерних элементов
    
      if (data.length) { // Проверяем есть ли данные
        var ul = document.createElement('ul'); // Создаём контейнер <ul>
        var tree = fetchChildElement(ul); // Создаём дерево
        node.appendChild(tree); // Добавляем дерево в наш node элемент
      }
    
      /**
        * Функция создаёт и возвращает готовое HTML дерево:
        * @param container - DOM элемент, контейнер для дерева
        * @param left - минимальное значение left (не обязательный)
        * @param right - максимальноее значение right (не обязательный)
        */
      function fetchChildElement(container, left, right) {
        data.filter(filterItems); // Перебираем массив данных
        return container;
    
        function filterItems(item) {
          if (item.left === (left || 1)) {
            var element = document.createElement('li');
            element.innerHTML = item.title;
    
            // Здесь мы проверяем есть ли у данного элемента
            // вложенные элементы. Если такие имеються, то для
            // них вызываем функцию заново.
            if (item.left + 1 < item.right) {
              var childContainer = document.createElement('ul');
              var child = fetchChildElement(childContainer, item.left + 1, item.right - 1);
              element.appendChild(child);
            }
    
            // Добавляем в контейнер новый элемент
            container.appendChild(element);
    
            // Здесь мы проверяем есть ли последующие элементы
            // и вызываем для них функцию.
            if (right && item.right < right) {
              fetchChildElement(container, item.right + 1, right);
            }
          }
        }
      }
    }
    

    这里的工作示例

    • 3
  2. Юрий Гапончук
    2020-08-17T20:54:28Z2020-08-17T20:54:28Z

    您是否也在尝试进行测试任务?))我找到了更适合我们的解决方案:

    function drawNestedSetsTree(data, node) {
      const ul = document.createElement('ul');
      data = data.sort((first, second) => {
        if (first.left > second.left) return 1;
        if (first.left < second.left) return -1;
      });
    
      let counts = data.length;
      console.log('counts',counts);
      for (let i = 0; i < counts; i++ ) {
        let item = data[i];
        console.log('item', item.title);
        let li = document.createElement('li');
        li.textContent = item.title;
        if ((item.right - item.left) == 1) {
          ul.appendChild(li);
        } else {
          data.splice(0, 1);
          let children = data.filter(x => x.left < item.right);
          data.splice(0, children.length);
          counts = counts - (children.length + 1);
          console.log('i', i);
          if (children.length > 0) {
            child = drawNestedSetsTree(children, li);
          }
          ul.appendChild(child);
        }
      };
      node.appendChild(ul);
      return node;
    }
    
    if (typeof module !== 'undefined') {
      module.exports = drawNestedSetsTree;
    }
    
    • 这是另一个深入研究的好材料http://www.getinfo.ru/article610.html

    祝你好运)

    • -1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5