【发布时间】:2020-06-29 11:23:40
【问题描述】:
在搜索我遇到的关于邻接列表中的树结构的问题的解决方案时。我遇到了一个为我解决了它的答案,但我无法理解它是如何工作的,我觉得我缺少对 javascript 的一些基本了解。
@TreyE 在this question 中的回答给出了排序树的下一个解决方案 ->
var flat = [
{ id: 1, name: "Business", parent: 0 },
{ id: 2, name: "Management", parent: 1 },
{ id: 3, name: "Leadership", parent: 2 },
{ id: 4, name: "Finance", parent: 1 },
{ id: 5, name: "Fiction", parent: 0 },
{ id: 6, name: "Accounting", parent: 1 },
{ id: 7, name: "Project Management", parent: 2 }
];
var nodes = [];
var toplevelNodes = [];
var lookupList = {};
for (var i = 0; i < flat.length; i++) {
var n = {
id: flat[i].id,
name: flat[i].name,
parent_id: ((flat[i].parent == 0) ? null : flat[i].parent),
children: []
};
lookupList[n.id] = n;
nodes.push(n);
if (n.parent_id == null) {
toplevelNodes.push(n);
}
}
for (var i = 0; i < nodes.length; i++) {
var n = nodes[i];
if (!(n.parent_id == null)) {
lookupList[n.parent_id].children = lookupList[n.parent_id].children.concat([n]);
}
}
console.log(toplevelNodes);
这工作得很好,但如果唯一被推送到它的东西是第一级元素,我就是无法理解所有这些逻辑是如何在toplevelNodes 下排序的。其余的在nodes 和lookuplist 上完成。我再次觉得我缺少对 javascript 的一些基本理解。 topLevelNodes 数组下的所有东西如何排序成一棵漂亮的儿童树?
【问题讨论】:
-
nodes和toplevelNodes在执行最后一个循环之前都包含相同的对象。push不复制对象,n引用两个数组中的同一个对象。 -
我建议您使用
console.dir(variable)查看数据并尝试自己弄清楚。
标签: javascript arrays