我有一个需要转换为json格式的列表。
此..
var sourceList = [
{ title: "item-1", indent: "0" },
{ title: "item-2", indent: "0" },
{ title: "item-3", indent: "0", folder: true },
{ title: "item-4", indent: "1" },
{ title: "item-5", indent: "1", folder: true },
{ title: "item-6", indent: "2" },
{ title: "item-7", indent: "2" },
{ title: "item-8", indent: "0" }
];
到此..
var targetJson = [
{ title: "item-1" },
{ title: "item-2" },
{ title: "item-3", folder: true, children: [
{ title: "item-4" },
{ title: "item-5", folder: true, children: [
{ title: "item-6" },
{ title: "item-7" }
]},
]},
{ title: "item-8" }
];
以便结果可以用于初始化树结构,如下所示。
item-1
item-2
item-3
.. item-4
.. item-5
.... item-6
.... item-7
item-8
每个源对象的'indent'属性确定其相对于前一个对象的位置。
如果一个对象的缩进大于前一个,那么它将被视为前一个的子节点,如果它具有与之前相同的缩进,那么它将被视为前一个的兄弟。 因此,对于具有子项的节点,将出现子属性和文件夹属性。
其中一个挑战是“第8项”,它在第2级时比前一级更高。
需要一个解决方案,最好是在javascript中。
答案 0 :(得分:2)
我在缩进和要添加子项的元素之间保持映射:
// test data
var sourceList = [
{ title: "item-1", indent: "0" },
{ title: "item-2", indent: "0" },
{ title: "item-3", indent: "0", folder: true },
{ title: "item-4", indent: "1" },
{ title: "item-5", indent: "1", folder: true },
{ title: "item-6", indent: "2" },
{ title: "item-7", indent: "2" },
{ title: "item-8", indent: "0" }
];
// init
var targetJson = [];
var roots = { 0 : targetJson};
// actual code:
sourceList.forEach(function(item){
if (!roots[item.indent].splice) {
roots[item.indent] = roots[item.indent].children = [];
}
roots[item.indent].push(item);
if (item.folder) {
roots[+item.indent+1] = item;
}
});
// output
console.log(targetJson);
PS:我在对象中保留了缩进属性,因此您可以检查结果。添加项目后,请随意将其删除。这是无关紧要的。