【发布时间】:2020-12-20 02:15:18
【问题描述】:
问题
我有一个平面对象数组,我想将它们变成嵌套树。我尝试过同时使用递归和归约,但还没有达到预期的效果。
具体来说我有数组:
const rawdata = [
{name: "A", parent: "All", value: null},
{name: "C", parent: "A", value: 10},
{name: "D", parent: "A", value: 20},
{name: "E", parent: "A", value: 30},
{name: "B", parent: "All", value: null},
{name: "F", parent: "B", value: 10},
{name: "G", parent: "B", value: 20},
{name: "H", parent: "B", value: 30}
]
期望的结果
我想把它变成:
let result = {name: "All",
children:
[
{name: "A",
children: [
{name: "C", value: 10},
{name: "D", value: 20},
{name: "E", value: 30},
],
value: null,
},
{name: "B",
children: [
{name: "F", value: 10},
{name: "G", value: 20},
{name: "H", value: 30},
],
value: null
}
]
}
我尝试过的:
我已经能够使用递归创建一棵树,其中 All 使用 name 和 parent 值位于最顶层,但我无法弄清楚如何保留values 作为对象的一部分。
let makeTree = (categories, parent) => {
let node = {}
categories
.filter(c => c.parent === parent)
.forEach(c => node[c.name] =
makeTree(categories, c.name))
return node
}
console.log(JSON.stringify(makeTree(rawdata, "All")), null, 2)
尝试应用此帖子 Create an tree of objects from arrays 中的代码,但我的情况有点不同。任何帮助表示赞赏!
我也尝试过使用:Build tree array from flat array in javascript
const nest = (items, id = null, link = 'parent_id') =>
items
.filter(item => item[link] === id)
.map(item => ({ ...item, children: nest(items, item.id) }));
console.log(nest(rawdata, id = 'name', link = 'parent'))
但也不能让它工作?
【问题讨论】:
-
是的,但我试图做一个简单的用例,可以推广到无限的父名关系
-
父母元素是否总是有
value: null? -
是的@MisterJojo
-
对不起@MisterJojo,感谢您手动制作“所需输出”并将更新!
-
你会在这里找到我的答案,如下...
标签: javascript recursion tree reduce