Javascript 基于层次的嵌套数组
我有一个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
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