javascript - 在javascript中编写 parent 的 child 的有效方式

标签 javascript performance for-loop

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/

相关文章:

c# - 负载下的 Ninject WebAPI.SelfHost 性能问题(每隔几秒出现几秒)

javascript for 循环顺序

javascript - jQuery 在某个 div 开始页面而不滚动

javascript - 尝试删除实体时出现 Breeze 错误

javascript - 异步调用导致信息在加载之前显示

sql - 从大型数据库中清除 SQL 表?

Mysql:如何正确使用和索引mysql where子句中的日期时间字段?

JavaScript,使用 for 循环计算数组中所有值的总和

ruby - 通过 ruby​​ 中循环内的函数移动到循环的下一个迭代

javascript - 将图像转换为圆形变体,改变圆的大小和位置