从平面数组构建一棵树

时间:2021-04-12 12:34:20

标签: javascript arrays tree nodes

我面临着从平面阵列构建一棵树的问题。我们有一个数组。

[
    {
        "h1": "h001",
        "h2": "z001"
    },
    {
        "h1": "h002",
        "h2": "z002"
    },
    {
        "h1": "h003",
        "h2": "z003"
    }
]

我想得到这样的东西:

[{
    "h1": "h001",
    "h2": "z001",
    "children": {
        "h1": "h002",
        "h2": "z002",
        "children": {
            "h1": "h003",
            "h2": "z003"
        }
    }
}]

有没有办法实现这一点?

谢谢!

3 个答案:

答案 0 :(得分:2)

这将是使用数组 map() 方法的好地方。本质上,我们将使用 slice() 获取数组的浅拷贝,然后使用 reverse() 它,然后使每个对象成为 children 属性下前一个对象的属性。完成后,我们重新reverse()数组以获取原始顺序并取第一项。

let values = [{
    "h1": "h001",
    "h2": "z001"
}, {
    "h1": "h002",
    "h2": "z002"
}, {
    "h1": "h003",
    "h2": "z003"
}];

let newValues = values.slice().reverse().map((e,i,a) => i ? (a[i] = { ...e, children: a[i-1] }) : a[i]).reverse()[0];

console.log(newValues);

输出:

{
  "h1": "h001",
  "h2": "z001",
  "children": {
    "h1": "h002",
    "h2": "z002",
    "children": {
      "h1": "h003",
      "h2": "z003"
    }
  }
}

答案 1 :(得分:1)

迭代那里的索引并将下一个节点添加到前一个索引。

实施:

const nodes = [{ "h1": "h001", "h2": "z001" }, { "h1": "h002", "h2": "z002" }, { "h1": "h003", "h2": "z003" }];

for (let i = 1; i < nodes.length; i++) {
    nodes[i - 1].children = nodes[i];
}

console.log('solutionByIndex', nodes[0]);

答案 2 :(得分:1)

您可以使用递归:

function to_tree(vals){
   var v = vals.shift()
   return vals.length ? {...v, children:to_tree(vals)} : v
}
var vals = [{ "h1": "h001", "h2": "z001" }, { "h1": "h002", "h2": "z002" }, { "h1": "h003", "h2": "z003" }];
console.log([to_tree(vals)])

相关问题