将数组展开为没有父级ID但具有级别的Tree

时间:2019-06-13 13:22:51

标签: javascript recursion

我有点暗示递归。我正在接收数据  从API。看起来像这样:

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 },
];

我需要类似

const out = [
  { id: 'a', nodes: [
    { id: 'b', nodes: [] },
    { id: 'c', nodes: [
      { id: 'd', nodes: [] },
    ] },
    { id: 'e', nodes: [] },
  ] },
  { id: 'f', nodes: [] },
];

您将如何以优雅的方式(例如out = f(input)来实现这一目标?

我觉得我们可以通过reduce来做一个递归的嵌套方法,但是我没有设法做到正确:)

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以对对象使用具有最新array / nodes属性的级别的辅助数组。

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 }],
    result = [],
    levels = [result];
    
input.forEach(({ id, level }) =>
    levels[level].push({ id, nodes: levels[level + 1] = [] })
);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

您可以尝试一下,

function makeObject(id){
  return { id: id, nodes:[] };
}

function addObjectToNodes(array, id, node){
  array.map(a => {
    if(a.id === id)
      a.nodes.push(node);
  });
}

const nodes = [];

nodes.push(makeObject('a'));
nodes.push(makeObject('f'));

addObjectToNodes(nodes, 'a', makeObject('b'));
addObjectToNodes(nodes, 'a', makeObject('c'));
addObjectToNodes(nodes, 'a', makeObject('d'));
addObjectToNodes(nodes, 'a', makeObject('e'));

console.log(nodes);