使用级别和名称信息的树层次结构使用 javascript

Tree hierarchy using level and name information using javascript

我有以下平面数据数组,主要带有级别,并且是有序的。根据级别,我需要创建一个树状分层数组。

输入如下:

[
    {
        "position": "CEO",
        "level": 1,
        "name": "Adam"
    },
    {
        "position": "President",
        "level": 2,
        "name": "Eva"
    },
    {
        "position": "Senior Vice President",
        "level": 3,
        "name": "Thein"
    },
    {
        "position": "Vice President",
        "level": 4,
        "name": "Rick"
    },
    {
        "position": "Vice President",
        "level": 4,
        "name": "Rosh"
    },
    {
        "position": "Vice President",
        "level": 4,
        "name": "Jenny"
    },
    {
        "position": "Vice President",
        "level": 4,
        "name": "Tim"
    },
    {
        "position": "Vice President",
        "level": 4,
        "name": "Gin"
    },
    {
        "position": "President",
        "level": 2,
        "name": "Nisham"
    },
    {
        "position": "Senior Vice President",
        "level": 3,
        "name": "Gil"
    },
    {
        "position": "Vice President",
        "level": 4,
        "name": "Lew"
    },
    {
        "position": "Vice President",
        "level": 4,
        "name": "Dan"
    },
    {
        "position": "Vice President",
        "level": 4,
        "name": "Henry"
    }
]

预期输出为:

[
    {
        "position": "CEO",
        "level": 1,
        "name": "Adam",
        "children": [
            {
                "position": "President",
                "level": 2,
                "name": "Eva",
                "children": [
                    {
                        "position": "Senior Vice President",
                        "level": 3,
                        "name": "Thein",
                        "children":[
                            {
                                "position": "Vice President",
                                "level": 4,
                                "name": "Rick"
                            },
                            {
                                "position": "Vice President",
                                "level": 4,
                                "name": "Rosh"
                            },
                            {
                                "position": "Vice President",
                                "level": 4,
                                "name": "Jenny"
                            },
                            {
                                "position": "Vice President",
                                "level": 4,
                                "name": "Tim"
                            },
                            {
                                "position": "Vice President",
                                "level": 4,
                                "name": "Gin"
                            }
                        ]
                    }
                ]
            },
            {
                "position": "President",
                "level": 2,
                "name": "Nisham",
                "children":[
                    {
                        "position": "Senior Vice President",
                        "level": 3,
                        "name": "Gil",
                        "children":[
                            {
                                "position": "Vice President",
                                "level": 4,
                                "name": "Lew"
                            },
                            {
                                "position": "Vice President",
                                "level": 4,
                                "name": "Dan"
                            },
                            {
                                "position": "Vice President",
                                "level": 4,
                                "name": "Henry"
                            }
                        ]
                    }
                ]
            }

        ]
    }
]

我遇到了很多堆栈,但它们都有一个 id 和 parent_id 作为 link。但是,在这个数据中,数组项之间没有id link。

到目前为止,我尝试了以下代码:

let root = {};
    let i = 0;
    data.forEach(el => {
        if (el["level"] == 1) {
            root = el;
            root.children = [];
        }
        if (el["level"] == 2) {
            root.children.push(el);
            root.children[i].children = [];
        }
        if (el["level"] == 3) {
            root.children[i].children.push(el);
            root.children[i].children[i].children = [];
        }
        if (el["level"] == 4) {
            root.children[i].children[i].children.push(el);
            root.children[i].children[i].children[i].children = [];
        }
        i++;
    });

它给出了第一遍的输出,但稍后抛出错误。我知道这是不对的,关卡是硬编码的,但这是目前的尝试。

您可以通过使用保留最后插入对象的所有级别的级别数组来使用几乎一行。

const
    data = [{ position: "CEO", level: 1, name: "Adam" }, { position: "President", level: 2, name: "Eva" }, { position: "Senior Vice President", level: 3, name: "Thein" }, { position: "Vice President", level: 4, name: "Rick" }, { position: "Vice President", level: 4, name: "Rosh" }, { position: "Vice President", level: 4, name: "Jenny" }, { position: "Vice President", level: 4, name: "Tim" }, { position: "Vice President", level: 4, name: "Gin" }, { position: "President", level: 2, name: "Nisham" }, { position: "Senior Vice President", level: 3, name: "Gil" }, { position: "Vice President", level: 4, name: "Lew" }, { position: "Vice President", level: 4, name: "Dan" }, { position: "Vice President", level: 4, name: "Henry" }],
    result = [],
    levels = [result];

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

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

一种没有未使用的子数组的方法。

const
    data = [{ position: "CEO", level: 1, name: "Adam" }, { position: "President", level: 2, name: "Eva" }, { position: "Senior Vice President", level: 3, name: "Thein" }, { position: "Vice President", level: 4, name: "Rick" }, { position: "Vice President", level: 4, name: "Rosh" }, { position: "Vice President", level: 4, name: "Jenny" }, { position: "Vice President", level: 4, name: "Tim" }, { position: "Vice President", level: 4, name: "Gin" }, { position: "President", level: 2, name: "Nisham" }, { position: "Senior Vice President", level: 3, name: "Gil" }, { position: "Vice President", level: 4, name: "Lew" }, { position: "Vice President", level: 4, name: "Dan" }, { position: "Vice President", level: 4, name: "Henry" }],
    result = [],
    levels = [{ children: result }];

data.forEach(function (o) {
    levels[o.level - 1].children = levels[o.level - 1].children || [];
    levels[o.level - 1].children.push(levels[o.level] = o);
});

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