我有一个包含一个级别的对象列表。对象的顺序引用了父对象。问题是,我的输入数据上没有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; }