Javascript 将数组取消平台化为树(没有父id但具有级别)

Javascript 将数组取消平台化为树(没有父id但具有级别),javascript,recursion,Javascript,Recursion,我被一些暗示递归的东西卡住了。我正在接收数据 来自API。看起来是这样的: const输入=[ {id:'a',级别:0}, {id:'b',级别:1}, {id:'c',级别:1}, {id:'d',级别:2}, {id:'e',级别:1}, {id:'f',级别:0}, ]; 我需要像这样的东西 const out=[ {id:'a',节点:[ {id:'b',节点:[]}, {id:'c',节点:[ {id:'d',节点:[]}, ] }, {id:'e',节点:[]}, ] }, {i

我被一些暗示递归的东西卡住了。我正在接收数据 来自API。看起来是这样的:

const输入=[
{id:'a',级别:0},
{id:'b',级别:1},
{id:'c',级别:1},
{id:'d',级别:2},
{id:'e',级别:1},
{id:'f',级别:0},
];
我需要像这样的东西

const out=[
{id:'a',节点:[
{id:'b',节点:[]},
{id:'c',节点:[
{id:'d',节点:[]},
] },
{id:'e',节点:[]},
] },
{id:'f',节点:[]},
];
您将如何以优雅的方式实现这一点,例如
out=f(input)

我觉得我们可以通过reduce实现递归嵌套方法,但我没有做到:)

提前谢谢

你可以这样尝试

函数makeObject(id){
返回{id:id,节点:[]};
}
函数addObjectToNodes(数组、id、节点){
array.map(a=>{
如果(a.id==id)
a、 nodes.push(节点);
});
}
常量节点=[];
nodes.push(makeObject('a'));
nodes.push(makeObject('f'));
addObjectToNodes(节点'a',makeObject'b');
addObjectToNodes(节点'a',makeObject'c');
addObjectToNodes(节点'a',makeObject'd');
addObjectToNodes(节点'a',makeObject'e');

console.log(节点)对于具有对象的最新数组/节点属性的级别,可以使用帮助器数组

const
input=[{id:'a',level:0},{id:'b',level:1},{id:'c',level:1},{id:'d',level:2},{id:'e',level:1},{id:'f',level:0}],
结果=[],
级别=[结果];
input.forEach({id,level})=>
级别[level]。推送({id,节点:级别[level+1]=[]))
);
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
似乎忽略了
级别
属性和预期结构之间的相关性…为什么
c
不是
b
的子级?@ClydeLobo它们具有相同的级别从您的输入构建树没有多大意义。因为缺少父-->子信息。例如a,f在0级,b,c和e在1级,所以b,c,e可能是a或f的孩子。类似地,d可以是b、c或e的子代。你如何确定谁是什么的孩子?@Ajit,顺序也是一个信息,除了等级之外。实际节点按顺序分配给给定的级别。我读了10遍,看看在哪里重新初始化子级别,以及在哪里设置子级别。气势汹汹@尼娜·斯科尔茨·胡特!我从来没有想过“分配时变异”。它非常聪明,我喜欢它!我会等待一点,看看其他的反应,但我会给你的信用!