考虑以下树:
[
{
id: 0,
children: [
{
id: 1,
id: 2
}
]
},
{
id: 3,
children: [
{ id: 4 },
{ id: 5,
children: [
{
id: 6,
id: 7
}
]
}
]
}
];
DFS Walker生成以下列表:
[
{ id: 0, isLeaf: false, nestingLevel: 0 },
{ id: 1, isLeaf: true, nestingLevel: 1 },
{ id: 2, isLeaf: true, nestingLevel: 1 },
{ id: 3, isLeaf: false, nestingLevel: 0 },
{ id: 4, isLeaf: true, nestingLevel: 1 },
{ id: 5, isLeaf: false, nestingLevel: 1 },
{ id: 6, isLeaf: true, nestingLevel: 2 },
{ id: 7, isLeaf: true, nestingLevel: 2 }
];
假设我们可以有两个以上的嵌套级别,如何从生成的列表中还原原始树?
答案 0 :(得分:3)
假设您想要具有singel id
属性的对象,则可以为相同级别获取一个辅助数组,并将与该对象一起的分配存储到以下子级别。
var data = [{ id: 0, isLeaf: false, nestingLevel: 0 }, { id: 1, isLeaf: true, nestingLevel: 1 }, { id: 2, isLeaf: true, nestingLevel: 1 }, { id: 3, isLeaf: false, nestingLevel: 0 }, { id: 4, isLeaf: true, nestingLevel: 1 }, { id: 5, isLeaf: false, nestingLevel: 1 }, { id: 6, isLeaf: true, nestingLevel: 2 }, { id: 7, isLeaf: true, nestingLevel: 2 }],
result = [],
levels = [result];
data.forEach(({ id, isLeaf, nestingLevel }) => levels[nestingLevel].push(isLeaf
? { id }
: { id, children: levels[nestingLevel + 1] = [] }
));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
版本略有不同,不使用isLeaf
,而存储时没有children
属性。
此属性仅在必要时为嵌套级别生成。
var data = [{ id: 0, nestingLevel: 0 }, { id: 1, nestingLevel: 1 }, { id: 2, nestingLevel: 1 }, { id: 3, nestingLevel: 0 }, { id: 4, nestingLevel: 1 }, { id: 5, nestingLevel: 1 }, { id: 6, nestingLevel: 2 }, { id: 7, nestingLevel: 2 }],
result = [],
levels = [result];
data.forEach(({ id, nestingLevel: l }) => {
if (!levels[l]) levels[l] = levels[l - 1][levels[l - 1].length - 1].children = [];
levels[l].push({ id });
levels.length = l + 1;
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }