基于级别的嵌套数组

2024-03-29

0: {content: "Heading 1 2 3 4 5", level: 2, anchor: "heading-1-2-3-4-5", className: "testtest", fontWeight: "", …}
1: {content: "Heading 2", level: 2, anchor: "heading-2", fontWeight: "", textTransform: "", …}
2: {content: "Inner Heading", level: 2, anchor: "inner-heading", fontWeight: "", textTransform: "", …}
3: {content: "Heading Level 3", level: 3, anchor: "heading-level-3", fontWeight: "", textTransform: "", …}
4: {content: "Heading Level 3-2", level: 3, fontWeight: "", textTransform: "", noBottomSpacing: false, …}
5: {content: "Heading Level 4", level: 4, anchor: "heading-level-4", fontWeight: "", textTransform: "", …}
6: {content: "Heading Level 2", level: 2, anchor: "heading-level-2", fontWeight: "", textTransform: "", …}
7: {content: "Heading 4", level: 6, anchor: "heading-4", fontWeight: "", textTransform: "", …}

我在 JavaScript 中有这个数组,我需要根据级别嵌套它。

例如,

level 2
level 2
level 2
   level 3
   level 3
     level 4
level 2
  level 4

嵌套这个的最好方法是什么?

到目前为止,我已经尝试过:

        const nestHeading = heading => {
            const nestedHeadersLength = nestedHeaders.length;

            if ( nestedHeadersLength >= 1 ) {
                const previousIndex = nestedHeadersLength - 1;

                if ( previousIndex >= 0 ) {
                    if (
                        heading.level !== nestedHeaders[ previousIndex ].level &&
                        heading.level > nestedHeaders[ previousIndex ].level
                    ) {
                        nestedHeaders[ previousIndex ].innerHeadings.push( heading );
                    } else {
                        nestedHeaders.push( heading );
                    }
                }
            } else {
                nestedHeaders.push( heading );
            }
        };

标题是原始数据集中的每个项目。


您可以为级别采用一个辅助数组,并为每个级别的索引采用一个辅助数组,作为对非零基或缺失级别的调整。

想象一下,你所有的level属性从零开始运行,并建立在该值之上并且没有漏洞,您只能采用该行

levels[index].push({ ...o, children: levels[index + 1] = [] });
//     ^^^^^                                                      parent
//                                          ^^^^^^^^^             children

with o.level代替index.

那么只有levels用于将节点移动到树的正确位置。每个级别都取决于之前的(较小的)级别。

级别不从零开始以及缺少级别的主要问题是将级别调整为有意义的索引。这是通过使用级别作为值并使用这些值的数组的索引来存档的。获取索引的规则是,如果没有找到,则取数组的最后一个长度,并将级别推送到indices大批。否则短路indices数组到length of index加一,以防止在数组中找到更深的嵌套符号。

var data = [{ content: "Heading 1 2 3 4 5", level: 2 }, { content: "Heading 2", level: 2 }, { content: "Inner Heading", level: 2 }, { content: "Heading Level 3", level: 3 }, { content: "Heading Level 3-2", level: 3 }, { content: "Heading Level 4", level: 4 }, { content: "Heading Level 2", level: 2 }, { content: "Heading 4", level: 6 },  { content: "Heading 1", level: 1 }, { content: "Heading 5", level: 5 }],
    result = [],
    indices = [],
    levels = [result];
   
data.forEach(o => {
    var index = indices.findIndex(level => level >= o.level);
    if (index === -1) {
        index = indices.push(o.level) - 1;
    } else {
        indices.length = index + 1;
    }
    levels[index].push(Object.assign({}, o, { children: levels[index + 1] = [] }));
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于级别的嵌套数组 的相关文章

随机推荐

  • 禁用部分内容的 CSS

    我正在使用 Yii bootstrap 扩展 但遇到一些样式问题 因为 bootstrap css 文件影响页面的主要内容 我的主要内容是使用 OpenLayers 完成的地图 因此我在它们之间混合样式时遇到了一些问题 我尝试做一个更通用的
  • 没有 v-model 的 Vue.JS 复选框

    尝试在不使用 v model 的情况下创建复选框
  • 服务层/存储库模式

    我正在使用 EF4 的服务层 存储库 工作单元模式构建一个 MVC 应用程序 我对逻辑有点困惑 我知道重点是解耦系统 但我有点困惑 因此 MVC 控制器调用服务来填充视图模型 那么可以肯定地说 MVC 应用程序耦合到服务层吗 然后服务层调用
  • sqlite3 - 插入 - javascript 对象作为值

    使用 javascript 对象作为 sqlite3 插入的值的最简单的解决方案是什么 下面的代码不起作用 const values name John age 34 language english db run INSERT INTO
  • 为什么 lodash 在否定函数中使用 switch-case? [复制]

    这个问题在这里已经有答案了 下面的代码是源码negateLodash 中的函数 我们可以看到 当参数长度小于4时 它使用switch case而不是使用apply直接地 这段代码有什么魔力呢 它会使性能更好吗 为什么分割点是4 functi
  • 如何更改 django runserver url?

    我正在尝试更改 django 项目 url 以便想要连接到局域网中网站的用户将看到 url 而不是 localhost 8000 或 127 0 0 1 我需要将 localhost 8000 users board 更改为http exa
  • Rails Engine + Mongoid:找不到名为“default”的会话的配置

    我创建了一个 Rails Mountable 应用程序并添加了 mongoid 和 rspec gem 如果我现在尝试运行我的规范 我会收到以下错误 Mongoid Errors NoSessionConfig Problem No con
  • HTML5 本地存储和变量类型

    我正在对 HTML5 中的本地存储进行一些测试 注意我使用的是 Safari 6 0 2 因为似乎许多 Web 引擎处理它们的方法不同 如果我这样做 localStorage setItem subTotal Number 12345 I
  • JavaScript 字符串连接速度

    有人可以向我解释一下这个吗 http jsperf com string concatenation 1 2 http jsperf com string concatenation 1 2 如果你很懒 我测试了 A 和 B A var i
  • ExecutorService workStealingPool 和取消方法

    您能想到为什么这段代码不起作用并且总是输出 完成 但第二个示例可以正常工作的任何原因吗 我正在使用最新的 JDK 8u45 public static class MyClass implements Runnable Override p
  • 将猫鼬流转换为数组

    我曾经使用过 mongodb 但对 mongoose ORM 还很陌生 我试图从集合中获取数据 explain 输出显示 50 毫秒 通过 mongoose 获取数据的总时间为 9 秒 这是查询 Node find dataset data
  • 无法在 Spring Boot 2(版本 2.0.0.M7)中包含 Prometheus 指标

    无法在 Spring Boot 2 版本 2 0 0 M7 项目中包含 Prometheus 指标 根据千分尺文档 https micrometer io docs ref spring 2 0 prometheus added sprin
  • 使用facet_wrap 设置中间的最后一个图

    我正在尝试使用facet wrap 创建一些多重图 但是我不确定这是否是适合我的图表的正确方法 这是一个简短的可重现示例 ggplot airquality aes x Day y Temp facet wrap Month geom li
  • Rails 的 recaptcha 插件

    我目前正在使用 ambethia 的 Rails recaptcha 插件 我想禁用该消息 验证码错误 每当用户错误地输入错误的验证码时 我该怎么做呢 在源文件中 我得到了围绕错误消息的以下标签 p class recaptcha erro
  • 将现有 asp.net-mvc 站点的一些调用公开给 Intranet 内的其他 REST 客户端?

    我有一个现有的 asp net mvc 网站 现在我需要公开一些对外部应用程序的调用 这些应用程序目前仅在我的网站中使用 这一切都发生在我公司的内部网内 我读过了这一页 http www binaryintellect net articl
  • Nestjs循环依赖forwardRef()的缺点

    官方循环依赖 https docs nestjs com fundamentals circular dependency says 当两个类相互依赖时 就会发生循环依赖 例如 类 A 需要类 B 类 B 也需要类 A 模块之间和提供程序之
  • R:动态更新公式

    如何动态更新公式 Example myvar lt x update y 1 x x y 1 works as intended update y 1 x myvar y x doesn t work as intended update
  • )没有标识符为'addSegue'的segue' aria-label=''接收器()没有标识符为'addSegue'的segue'> '接收器()没有标识符为'addSegue'的segue

    我有一个导航控制器 它们之间有一个名为 addSegue 的 segue 链接 当我点击tableView尽管应用程序崩溃了 但我收到以下错误 Terminating app due to uncaught exception NSInva
  • 选择器之前的 CSS 空格

    我很难理解为什么我的 HTML 元素没有选择这个简单的 CSS 类选择器 label hi before color green content Hi 简单选择器之间的空格是后代组合器 http www w3 org TR css3 sel
  • 基于级别的嵌套数组

    0 content Heading 1 2 3 4 5 level 2 anchor heading 1 2 3 4 5 className testtest fontWeight 1 content Heading 2 level 2 a