var obj = [{
id: 1,
child:[2,4],
data : "hello"
},{
id: 2,
child:[3],
data : "I m second"
},
{
id: 3,
child:[],
data : "I m third"
},
{
id: 4,
child:[6],
data : "I m fourth"
},{
id: 5,
child:[],
data : "I m fifth"
},{
id: 6,
child:[],
data : "I m sixth"
}];
我已将此对象转换为
var newObj = [{
id: 1,
child: [{
id: 2,
child: [{
id: 3,
child: [],
data: "I m third"
}],
data: "I m second"
}, {
id: 4,
child: [{
id: 6,
child: [],
data: "I m sixth"
}],
data: "I m fourth"
}],
data: "hello"
}, {
id: 5,
child: [],
data: "I m fifth"
}];
基于每个属性的子数组,它只是JSON的树格式。如何解决问题?如何在javascript中编码?
任何帮助都会有所体现。提前谢谢。
答案 0 :(得分:1)
包含临时对象的提案,用于保留对项目的引用。
var array = [{ id: 1, child: [2, 4], data: "hello" }, { id: 2, child: [3], data: "I m second" }, { id: 3, child: [], data: "I m third" }, { id: 4, child: [6], data: "I m fourth" }, { id: 5, child: [], data: "I m fifth" }, { id: 6, child: [], data: "I m sixth" }],
tree = [];
array.forEach(function (a) {
if (!this[a.id]) {
this[a.id] = { id: a.id };
tree.push(this[a.id]);
}
this[a.id].data = a.data;
this[a.id].child = a.child.map(function (b) {
this[b] = this[b] || { id: b };
return this[b];
}, this);
}, Object.create(null));
document.write('<pre>' + JSON.stringify(tree, 0, 4) + '</pre>');
答案 1 :(得分:1)
好吧..因为我评论过这个是一个很好的问题,很高兴对此进行一些思考。显然,这比扁平化嵌套对象数组更难。
顺便说一下,算法不依赖于对象的id和数组中的对象键之间的任何关联。任何id的对象都可以在数组中的任何位置。
var obj = [{ id: 1, child: [2, 4], data: "hello" }, { id: 2, child: [3], data: "I m second" }, { id: 3, child: [], data: "I m third" }, { id: 4, child: [6], data: "I m fourth" }, { id: 5, child: [], data: "I m fifth" }, { id: 6, child: [], data: "I m sixth" }];
function construct(flat){
function nest(o) {
o.forEach( c => { if (!!c.child.length) { // coolness starts here
c.child = c.child.map( e => flat.splice(flat.findIndex( f => f.id == e),1)[0]);
nest(c.child);
}
});
}
nest(flat);
return flat;
}
document.write("<pre>" + JSON.stringify(construct(obj), null, 2) + "</pre>");