如何从平面归一化对象阵列中生成祖先平面?

时间:2019-04-17 06:52:41

标签: javascript

我需要生成一个平面对象数组,其中包含平面归一化对象数组中给定对象的所有祖先。

存在许多将其变成嵌套树状结构的示例,但是我无法找到简单地以平面数组形式返回所有祖先的任何信息。平面归一化数组中的每个对象都有一个id和一个parentId。

给出对象的平面归一化数组

[
  {
    id: 1,
    name: "node 1",
    parentId: null,
  }, {
    id: 2,
    name: "node 2",
    parentId: 1,
  }, {
    id: 3,
    name: "node 3",
    parentId: null,
  }, {
    id: 4,
    name: "node 4",
    parentId: 3,
  }, {
    id: 5,
    name: "node 5",
    parentId: 2,
  }, {
    id: 6,
    name: "node 6",
    parentId: 1,
  }, {
    id: 7,
    name: "node 7",
    parentId: 6,
  },
]

执行getAncestors(1)时,它应返回节点1的所有祖先

[
  {
    id: 2,
    name: "node 2",
    parentId: 1,
  }, {
    id: 5,
    name: "node 5",
    parentId: 2,
  }, {
    id: 6,
    name: "node 6",
    parentId: 1,
  }, {
    id: 7,
    name: "node 7",
    parentId: 6,
  },
]

我尝试过修改将其变成嵌套树状结构的功能,但是没有运气。

1 个答案:

答案 0 :(得分:1)

要进行更快速的访问,您需要一个Map,其中所有节点及其节点id为键,以及所有以parentId为键的父节点的映射。然后,您需要功能getAncestors,在内部,您还需要一个功能来获得其祖先的点头。

用reduce组合在一起,然后返回结果。

function getAncestors(parentId) {
    const getNode = node => [node, ...getAncestors(node.id)];
    return (parents.get(parentId) || []).reduce((r, id) => [...r, ...getNode(nodes.get(id))], []);
}

var data = [{ id: 1, name: "node 1", parentId: null, }, { id: 2, name: "node 2", parentId: 1 }, { id: 3, name: "node 3", parentId: null }, { id: 4, name: "node 4", parentId: 3 }, { id: 5, name: "node 5", parentId: 2 }, { id: 6, name: "node 6", parentId: 1 }, { id: 7, name: "node 7", parentId: 6 }],
    nodes = new Map(data.map(o => [o.id, o])),
    parents = data.reduce((m, { id, parentId }) => m.set(parentId, [... (m.get(parentId) || []), id]), new Map);

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