首页 > 解决方案 > 如何使用 lodash 从子项中查找父名并打印路径

问题描述

我有一个像下面这样的集合

const tree = [
    {
        id: 1,
        class_name: 'Home',
        parent_id: 0,
    },
    {
        id: 2,
        class_name: 'Folder1',
        parent_id: 1,
    },
    {
        id: 3,
        class_name: 'Folder2',
        parent_id: 1,
    },
    {
        id: 4,
        class_name: 'SubFolder1',
        parent_id: 2
    },
    {
        id: 5,
        class_name: 'EndFolder1',
        parent_id: 4
    }
]

在这个集合中,我知道子类名称为 SubFolder1,id 为 4,parent_id 为 2,我需要从这个父 id 遍历到根节点以找到下面的路径。父 id 充当每个对象的 id。

SubFolder1
Folder1/SubFolder1
Home/Folder1/SubFolder1

我已经尝试使用 lodash find 停止在一个级别中,当 parent_id 为 0 时,我需要遍历它的根。并添加路径。

 if (temp.parent_id !== '0') {
    temp = find(tree, {id: temp.parent_id});
 } else {
    tempClassName = `${temp.class_name}`;
 }

标签: javascriptlodash

解决方案


您可以将具有所有节点的对象id作为键并获取所有父对象,直到没有id可用为止。

const
    getParents = (array, id) => {
        const
            nodes = array.reduce((r, o) => (r[o.id] = o, r), {}),
            getP = id => id in nodes
                ? [...getP(nodes[id].parent_id), nodes[id].class_name]
                : [];
        return getP(id).join('/');
    },
    array = [{ id: 1, class_name: 'Home', parent_id: 0 }, { id: 2, class_name: 'Folder1', parent_id: 1 }, { id: 3, class_name: 'Folder2', parent_id: 1 }, { id: 4, class_name: 'SubFolder1', parent_id: 2 }, { id: 5, class_name: 'EndFolder1', parent_id: 4 }];

console.log(getParents(array, 4));


推荐阅读