当仅知道 "depth" 而不是 "parent ID" 时,从平面有序数组构建树数组

Build tree array from flat ordered array when only "depth" and NOT "parent ID" is known

this thread 和我搜索过的其他地方的答案只有在“parent_id”对于数组中的每个对象都是已知的情况下才有效。

如果对象的唯一 属性 是 depth 怎么办?

深​​度本质上告诉我该项目是“根节点”(depth of 1)还是“子节点”(depth of 2 或更多)。

如果前面的对象具有较小的 depth,则子对象的父对象是直接在它之前的对象。 (父级的深度应始终比其子级多 1。)

如果一个对象与前面的对象具有相同的depth,则它们实际上是同一级别的兄弟

如果前面的对象具有更高的 depth,则当前项实际上是具有相同 depth 的最早的前面项的兄弟项(或者您也可以将其视为具有较低 depth)

的最早的前一项的子项

例如

// Please note "name" in the example below 
// is just for illustrative purposes.
// My actual array will have random names

const items = [
    {
        name: "1",
        depth: 1,
    },
    {
        name: "2",
        depth: 1,
    },
    {
        name: "2_1",
        depth: 2,
    },
    {
        name: "2_1_1",
        depth: 3,
    },
    {
        name: "2_1_2",
        depth: 3,
    },
    {
        name: "2_2",
        depth: 2,
    },
]

所以我想将该平面数组转换为树形结构,例如:

const newItems = [
    {
        name: "1",
        depth: 1,
        children: [],
    },
    {
        name: "2",
        depth: 1,
        children: [
            {
                name: "2_1",
                depth: 2,
                children: [
                    {
                        name: "2_1_1",
                        depth: 3,
                        children: [],
                    },
                    {
                        name: "2_1_2",
                        depth: 3,
                        children: [],
                    },
                ],
            },
            {
                name: "2_2",
                depth: 2,
                children: [],
            },
        ],
    },
]

您可以为关卡获取辅助数组并将对象分配给 depth 的最新数组。

const
    items = [{ name: "1", depth: 1 }, { name: "2", depth: 1 }, { name: "2_1", depth: 2 }, { name: "2_1_1", depth: 3 }, { name: "2_1_2", depth: 3 }, { name: "2_2", depth: 2 }],
    tree = [],
    levels = [tree];

items.forEach(o =>
    levels[o.depth - 1].push({ ...o, children: levels[o.depth] = [] })
);

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