var array = [
{id: 1, name: "Father", parent_id: null},
{id: 2, name: "Child", parent_id: 1},
{id: 3, name: "Child", parent_id: 1},
{id: 4, name: "ChildChild", parent_id: 2},
{id: 5, name: "ChildChildChild", parent_id: 4}
]
for(var i in array){
if(array[i].parent_id == null){
console.log(array[i].name);
} else {
for(var j in array){
if(array[i].parent_id == array[j].id && array[j].parent_id == null){
console.log(">" + array[i].name);
for(var x in array){
if(array[i].id == array[x].parent_id){
console.log(">>" + array[x].name);
}
}
}
}
}
}
输出:
Father
>Child
>>ChildChild
>Child
我有这个包含 id、name 和 parent_id 的数组。现在它是固定的,但它可以有多个数组并且可以嵌套 n 次。
我在这里所做的是遍历每个数组并尝试找出哪些是父项,哪些是子项。
我想知道是否有更有效的方法来编写这段代码。例如,我添加了第五个 id 但这将需要另一个 for 循环等等。输出将与打印出的树相同。
最佳答案
您可以使用 Map
通过 id 为您的节点设置键,然后使用递归优先遍历它们:
var array = [{id: 1, name: "Father", parent_id: null},{id: 2, name: "Child", parent_id: 1},{id: 3, name: "Child", parent_id: 1},{id: 4, name: "ChildChild", parent_id: 2},{id: 5, name: "ChildChildChild", parent_id: 4}];
let map = new Map(array.map(({id}) => [id, []])).set(null, []);
array.forEach(node => map.get(node.parent_id).push(node));
function dfs(nodes, indent="") {
for (let node of nodes) {
console.log(indent + node.name);
dfs(map.get(node.id), indent+">");
}
}
dfs(map.get(null));
关于javascript - 在javascript中编写 parent 的 child 的有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61531898/