如何修复节点parent_id?

时间:2019-07-02 08:31:50

标签: javascript

我正在建立一个数据结构,我想修复节点。

var data = [{
  id: 1,
  parent_id: 321
}, {
  id: 2,
  parent_id: 1
}, {
  id: 3,
  parent_id: 1
}, {
  id: 4,
  parent_id: 5
}, {
  id: 5,
  parent_id: 4
}];
const makeTree = (items, id, link = 'parent_id') => items.filter(item => item[link] == id).map(item => ({
  ...item,
  children: makeTree(items, item.id)
}));
console.log(makeTree(data));

如果节点在集合中不存在parent_id处的引用,则我的代码将不返回任何内容。并且有必要返回该节点(无论他的父母不在那里)。想要的结果是当我的{id: 1, parent_id: 321}有两个孩子{id: 2, parent_id: 1}{id: 3, parent_id: 1}时。

1 个答案:

答案 0 :(得分:0)

您可以采取分阶段的方法,首先创建所有节点的关系,然后获取每个节点的深度,然后按深度过滤以获取最大的深度。最后,您将获得最大节点的部分树。

function getDepth({ id, children }, seen = new Set) {
    if (seen.has(id)) return 0; // prevent circular references
    if (!children) return 1;
    seen.add(id);
    return children.reduce((c, o) => c + getDepth(o, seen), 1);
}

function getRelations(data) {
    var t = {};
    data.forEach((o) => {
        Object.assign(t[o.id] = t[o.id] || {}, o);
        t[o.parent_id] = t[o.parent_id] || {};
        t[o.parent_id].children = t[o.parent_id].children || [];
        t[o.parent_id].children.push(t[o.id]);
    });
    return t;
}

var data = [{ id: 1, parent_id: 321 }, { id: 2, parent_id: 1 }, { id: 3, parent_id: 1 }, { id: 4, parent_id: 5 }, { id: 5, parent_id: 4 }],
    relations = getRelations(data),
    longest = data
        .map(({ id }) => [id, getDepth(relations[id])])
        .reduce((r, a, i) => {
            if (!i || r[0][1] < a[1]) return [a];
            if (r[0][1] === a[1]) return r.push(a);
            return r;
        }, [])
        .map(([id]) => relations[id]);

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