javascript - 在javascript中将数组转换为嵌套对象

标签 javascript arrays node.js tree

我有典型的组织层次结构。例如。

D,E is reporting to B. B,C is reporting to A.

A 是最顶层的 Node 。但我收到的数据是一个平面数组,带有一个指向父级的属性。

    [{
      name: "A",
      parent: null
    },
    {
      name: "B",
      parent: "A"
    },
    {
      name: "C",
      parent: "A"
    },
    {
      name: "D",
      parent: "B"
    },
    {
      name: "E",
      parent: "B"
    }]

但我想将其转换为单个嵌套对象。根 Node 具有嵌入子 Node 的子 Node 属性,每个子 Node 都有自己的子 Node 属性,如下所示。

    {
      name: "A",
      children: [{
        name: "C"
        children: [{
          name: "D"
        },{
          name: "E"
        }]
      },{
        name: "C"
      }]
    }

我怎样才能在 javascript 中有效地做到这一点?

最佳答案

与其他解决方案不同,它使用单个循环 - 数据的顺序不重要 - 示例与问题的顺序不同

var peeps = [
    { name: "D", parent: "B" }, 
    { name: "B", parent: "A" },
    { name: "A", parent: null }, 
    { name: "C", parent: "A" }, 
    { name: "E", parent: "B" }
];

var tree;
var obj = {};
peeps.forEach(function (peep) {
    var name = peep.name,
        parent = peep.parent,
        a = obj[name] || { name: name };
    if (parent) {
        obj[parent] = obj[parent] || { name: parent };
        obj[parent].children = obj[parent].children || [];
        obj[parent].children.push(a);
    } else {
        tree = obj[name];
    }
    obj[name] = obj[name] || a;
});
console.log(tree);

关于javascript - 在javascript中将数组转换为嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34679603/

相关文章:

javascript - ExtJS - 如何自动滚动到表单字段?

javascript - Antd RangePicker 无法为 Time 设置 12 小时格式

Javascript 多个 setIntervals

node.js - 如何使用 NodeJS 和条件表达式访问 DynamoDB 中的嵌套元素?

javascript - 选择jquery中动态创建的元素

c - 从 C 中的数组中删除元素

c++ - 在 C++ 中创建固定大小的 int 数组的动态大小数组

javascript - 使用 Request.JSON 将 html 数组作为 post 变量发送

node.js - JadeJS 和重新渲染 View 时预先写入的表单值

javascript - Node.js:process.env 与 global 有何不同?