从平面阵列构建一棵树
Build a tree from a flat array
我遇到了从平面阵列构建树的问题。我们有一个数组。
[
{
"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"
}
}
}]
有没有办法实现这个?
谢谢!
迭代那里的索引并将下一个节点添加到上一个索引。
实施:
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]);
这是使用数组 map()
方法的好地方。本质上,我们将使用 slice()
获取数组的浅表副本,然后 reverse()
它,然后使每个对象成为 children
[=] 下前一个对象的 属性 27=]。完成后,我们重新[=14=] 数组以获取原始顺序并取第一项。
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"
}
}
}
你可以使用递归:
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)])
我遇到了从平面阵列构建树的问题。我们有一个数组。
[
{
"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"
}
}
}]
有没有办法实现这个?
谢谢!
迭代那里的索引并将下一个节点添加到上一个索引。
实施:
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]);
这是使用数组 map()
方法的好地方。本质上,我们将使用 slice()
获取数组的浅表副本,然后 reverse()
它,然后使每个对象成为 children
[=] 下前一个对象的 属性 27=]。完成后,我们重新[=14=] 数组以获取原始顺序并取第一项。
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"
}
}
}
你可以使用递归:
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)])