这是输入的数据。
let list = [
{
name: "h1",
level: 1,
children: []
},
{
name: "h2",
level: 2,
children: []
},
{
name: "h3",
level: 3,
children: []
},
{
name: "paragraph",
level: 1,
children: []
},
{
name: "bold",
level: 2,
children: []
},
{
name: "italic",
level: 2,
children: []
},
{
name: "paragraph",
level: 1,
children: []
}
]
结果结果是这样的
[
{
"name": "h1",
"level": 1,
"children": [
{
"name": "h2",
"level": 2,
"children": [{
"name": "h3",
"level": 3,
"children": []
}]
}
]
},
{
"name": "paragraph",
"level": 1,
"children": [
{
"name": "bold",
"level": 2,
"children": []
},
{
"name": "italic",
"level": 2,
"children": []
}
]
},
{
"name": "paragraph",
"level": 1,
"children": []
}
]
这是我的尝试。问题是我在迭代之间只携带finalist和当前值。当级别更高时,我将其添加到最后一个item children值。这适用于第一层。但是我如何告诉它检查它的子对象并向下冒泡整个对象以进行正确的插入。
它应该只加到孩子身上,如果它大于,如果它等于,孩子,就把它加到兄弟上,我似乎只能做或者,我有嵌套孩子的代码,但是我不能做兄弟,我在兜圈子。
const initialValue = [];
const output = list.reduce((acc,curr, index,arr)=>{
console.log(index,"start========:",acc, "||", curr)
if(index === 0){
console.log(index, "push first into array")
return acc.concat([curr])
}
console.log(index,"compare level?",acc[acc.length - 1].level, curr.level)
if(acc[acc.length - 1].level < curr.level){
console.log(index, acc[acc.length - 1].children, "push bold into paragraph")
acc[acc.length - 1].children.push(curr);
console.log(index, "check result?", acc)
return acc
} else {
return acc.concat([curr])
}
return acc;
}, initialValue
);
console.log("output:",JSON.stringify(output,null, 1))
1条答案
按热度按时间c3frrgcw1#
假设
.level
的值为i
的元素不能被level
的值大于i + 1
的元素继承:(this尽可能明确地写出来,以便于解释;更简洁的版本可以在下面的片段中找到)
解释
首先,创建一个由“根”元素组成的堆栈;它的子元素将是我们想要的新列表:
然后,迭代给定元素的列表,并在我们进行时克隆它们:
如果
object
(当前元素)比栈顶的元素浅,弹出object
之后的所有元素并将其推送到栈中。我们还将其推送到第二个最上面的元素.children
,因为它现在已经成为object
的父元素:如果
object
更深,则将其推送到堆栈和最顶层元素的.children
:如果
object
的级别与顶层元素的级别相同,则将object
设为新的顶层元素,并将其推到次顶层元素的.children
:最后,返回bottommost(或“root”)的子节点;这就是我们要的名单
试试看: