Javascript 基于层次的嵌套数组

Javascript 基于层次的嵌套数组,javascript,data-structures,tree,Javascript,Data Structures,Tree,我有一个JavaScript数组,我需要根据级别嵌套它 比如说, 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: {con

我有一个JavaScript数组,我需要根据级别嵌套它

比如说,

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: "", …}
什么是最好的嵌套方式

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

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 );
            }
        };
o.level
代替
索引

然后仅使用
级别
将节点移动到树的右侧位置。每个级别取决于之前的(较小)级别

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

var data=[{content:“Heading 1 2 3 4 5”,level:2},{content:“Heading 2”,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},{内容:“标题1”,级别:1},{内容:“标题5”,级别:5}],
结果=[],
指数=[],
级别=[结果];
data.forEach(o=>{
var指数=指数.findIndex(级别=>级别>=o.level);
如果(索引==-1){
指数=指数。推力(o级)-1;
}否则{
指数长度=指数+1;
}
级别[index].push(Object.assign({},o,{子级:级别[index+1]=[]}));
});
console.log(结果);

.as控制台包装{最大高度:100%!重要;顶部:0;}
阅读以下内容:这是Ruby语言上最流行的实现。主要是一个额外的lft、rgt字段,可用于一个查询的所有树操作。Javascript实现:相关程度如何?@Haris您到目前为止做了哪些尝试?请更新您的问题?@Ejaz47刚刚做了。您能提供一个预期结果的示例吗?谢谢ou!您是否可以逐行解释解决方案,这样我就不会复制/粘贴解决方案?感谢您的解释,这很有意义。但是,如果您向数据集添加另外两个条目,整个逻辑将失败,例如{content:“Heading 1”,level:1},{content:“Heading 5”,level:5}它需要相同的第一个级别
2
。否则它将被视为最后一个嵌套级别的扩展。这是新规则吗?
levels[index].push({ ...o, children: levels[index + 1] = [] });
//     ^^^^^                                                      parent
//                                          ^^^^^^^^^             children