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

4nkexdtk  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(112)

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

    • 输入:**
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:[]
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

在这里,例如,我已经采取了,直到lvl4,但任何数量的水平可以有像lvl5,lvl6 ...
我尝试过一种方法,但我觉得那非常复杂,而且不能扩展。

b0zn9rqh

b0zn9rqh1#

您可以将具有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; }

相关问题