将任意层次数组的平面结构转换为树形结构



我想将平面结构数组转换为我的一个项目的树结构。下面是输入和预期输出:

输入:

let input=[
{
lvl1:"Code1",
lvl2:"Type1",
lvl3:"Desc1",
lvl4:"Check1"
},
{
lvl1:"Code1",
lvl2:"Type1",
lvl3:"Desc1",
lvl4:"Check2"
},
{
lvl1:"Code2",
lvl2:"Type2",
lvl3:"Desc2",
lvl4:"Check1"
},
]

输出:

[
{
level_key:"lvl1",
level_value:"Code1",
children:[
{
level_key:"lvl2",
level_value:"Type1",
children:[
{
level_key:"lvl3",
level_value:"Desc1",
children:[
{
level_key:"lvl4",
level_value:"Check1",
children:[]
},
{
level_key:"lvl4",
level_value:"Check2",
children:[]
}
]
}
]
}
]
},
{
level_key:"lvl1",
level_value:"Code2",
children:[
{
level_key:"lvl2",
level_value:"Type2",
children:[
{
level_key:"lvl3",
level_value:"Desc2",
children:[
{
level_key:"lvl4",
level_value:"Check1",
children:[]
}
]
}
]
}
]
}
]

Here in eg。我已经选择了lvl4但是lvl5, lvl6都有可能....

我已经尝试了一种方法,但我觉得它非常复杂,不可扩展。

您可以将level_value作为键的对象,并将数组作为结果。

const
flat = [{ lvl1:"Code1", lvl2:"Type1", lvl3:"Desc1", lvl4:"Check1" }, { lvl1:"Code1", lvl2:"Type1", lvl3:"Desc1", lvl4:"Check2" }, { lvl1:"Code2", lvl2:"Type2", lvl3:"Desc2", lvl4:"Check1" }],
tree = flat.reduce((r, o) => {
let temp = r,
i = 1,
level_key = `lvl${i}`,
level_value = o[level_key];

do {
if (!temp[level_value]) {
temp[level_value] = { _: [] };
temp._.push({ level_key, level_value, children: temp[level_value]._ });
}
temp = temp[level_value];
level_key = `lvl${++i}`;
level_value = o[level_key];
} while (level_value)
return r;
}, { _: [] })._;


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