嗨,我刚接触下划线实用程序可以帮助我解决这个问题。
示例JSON:
[
{
L0: "Level0",
L1: "Level1",
L2: "Level2",
L3: "Level3"
},
{
L0: "Level0",
L1: "Level1a",
L2: "Level2",
L3: "Level3"
},
{
L0: "Level0",
L1: "Level1",
L2: "Level2a",
L3: "Level3"
},
{
L0: "Level0",
L1: "Level1",
L2: "Level2",
L3: "Level3a"
},
{
L0: "Level0a",
L1: "Level1",
L2: "Level2",
L3: "Level3"
}
];
预期的JSON:
[
{
L0: "Level0",
L1: [
{
L1: "Level1",
L2: [
{
L2: "Level2",
L3: [
{
L3: "Level3"
},
{
L3: "Level3a"
}
]
},
{
L2: "Level2a",
L3: "Level3"
}
]
},
{
L1: "Level1a",
L2: "Level2",
L3: "Level3"
}
]
},
{
L0: "Level0a",
L1: "Level1",
L2: "Level2",
L3: "Level3"
}
];
请通过下划线/ lodash帮助我实现预期的JSON格式。它成为我实现同样的梦魇。我写了冗长的代码仍然无法实现它。感谢您的帮助
提前致谢!
答案 0 :(得分:0)
对于这个树结构,如果不再需要嵌套项,则需要一个带有相关键的数组,一个对象数组的循环和一个短路属性的循环。
您可以查找关卡的有用属性,如果找到,请检查属性是否为数组,如果没有创建并返回该数组,则继续。
如果未找到,请使用实际键和其余键创建一个新对象并停止迭代。
要获得JSON兼容字符串,您可以使用JSON.stringify
,此答案中不包含该字符串。
var array = [{ L0: "Level0", L1: "Level1", L2: "Level2", L3: "Level3" }, { L0: "Level0", L1: "Level1a", L2: "Level2", L3: "Level3" }, { L0: "Level0", L1: "Level1", L2: "Level2a", L3: "Level3" }, { L0: "Level0", L1: "Level1", L2: "Level2", L3: "Level3a" }, { L0: "Level0a", L1: "Level1", L2: "Level2", L3: "Level3" }],
keys = ['L0', 'L1', 'L2', 'L3'],
result = [];
array.forEach(o => {
var level = result;
keys.some((k, i, kk) => {
var temp = level.find(l => l[k] === o[k]);
if (temp && kk[i + 1]) {
if (!Array.isArray(temp[kk[i + 1]])) {
temp[kk[i + 1]] = [Object.assign(...kk.slice(i + 1).map(l => ({ [l]: temp[l] })))];
kk.slice(i + 2).forEach(l => { delete temp[l]; });
}
level = temp[kk[i + 1]];
return;
}
level.push(Object.assign(...kk.slice(i).map(l => ({ [l]: o[l] }))));
return true;
}, result);
});
console.log(result);

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