创建树结构,而没有任何父级作为一个级别的对象列表中的输入



我有一个包含一个级别的对象列表。对象的顺序引用了父对象。问题是,我的输入数据上没有parrendid。

输入数据:

const listData = [
    { level: 1, name: "a" }, 
    { level: 2, name: "b", someOther: "asd" },
    { level: 2, name: "c" },
    { level: 3, name: "d" },
    { level: 4, name: "e" },
    { level: 2, name: "f" }
]

输出接口应该看起来像这样:

interface Item {
    name: String;
    listData?: Item[]
    ... otherKeys
}

我试图将父级引用添加到每个对象和一个getParentByLevelSbackwards(元素,级别),但实际上并没有解决。

我在这里添加了完整的测试代码。也许有人有很好的参考解决此类问题,甚至更好地解决此问题?

// listData has n objects with n levels from 1 to x
// listData elements can have other attributes that should be persisted
// sublevel level should always +1
const assert = require("assert");
const listData = [{
        level: 1,
        name: "a"
    }, //first is always level 1
    {
        level: 2,
        name: "b",
        someOther: "asd"
    },
    {
        level: 2,
        name: "c"
    },
    {
        level: 3,
        name: "d"
    },
    {
        level: 4,
        name: "e"
    },
    // { level: 5, name: "e" }, // would give bonus points
    {
        level: 2,
        name: "f"
    }
];
const resultToBe = [{
    level: 1,
    name: "a",
    listData: [{
            level: 2,
            name: "b",
            someOther: "asd"
        },
        {
            level: 2,
            name: "c",
            listData: [{
                level: 3,
                name: "d",
                listData: [{
                    level: 4,
                    name: "e"
                }]
            }]
        },
        {
            level: 2,
            name: "f"
        }
    ]
}];
const createResult = listData => {
    return [];
};
const test = () => {
    const result = createResult(listData);
    console.log("Input is:", JSON.stringify(listData, null, 4));
    console.log("Result is:", JSON.stringify(result, null, 4));
    assert.deepStrictEqual(result, resultToBe, "Objects missmatch");
};
test();
 

您可以将数组作为最后插入级别的助手数组使用数组。

const
    listData = [{ level: 1, name: "a" }, { level: 2, name: "b", someOther: "asd" }, { level: 2, name: "c" }, { level: 3, name: "d" }, { level: 4, name: "e" }, { level: 2, name: "f" }],
    result = [],
    levels = [result];
listData.forEach(o => {
    o.children = [];
    levels[o.level] = o.children;
    levels[o.level - 1].push(o);
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

没有空的儿童阵列相同。

const
    listData = [{ level: 1, name: "a" }, { level: 2, name: "b", someOther: "asd" }, { level: 2, name: "c" }, { level: 3, name: "d" }, { level: 4, name: "e" }, { level: 2, name: "f" }],
    result = [],
    levels = [result];
listData.forEach(o => {
    if (!levels[o.level - 1]) {
        var temp = levels[o.level - 2],
            last = temp[temp.length - 1];
        levels[o.level - 1] = [];
        last.children = levels[o.level - 1];
    }
    levels[o.level - 1].push(o);
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新