Javascript 将JSON对象转换为JSON树
我已将此对象转换为Javascript 将JSON对象转换为JSON树,javascript,arrays,json,Javascript,Arrays,Json,我已将此对象转换为 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,
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"
}];
它只是基于每个属性的子数组的JSON树格式。如何解决这个问题??如何用javascript编写代码
任何帮助都是值得的。提前谢谢
带有临时对象的提案,用于保留对项目的引用
var数组=[{id:1,child:[2,4],数据:“你好”},{id:2,child:[3],数据:“我是第二个”},{id:3,child:[],数据:“我是第三个”},{id:4,child:[6],数据:“我是第四个”},{id:5,child:[],数据:“我是第五个”},{id:6,child:[],数据:“我是第六个”},
树=[];
array.forEach(函数(a){
如果(!此[a.id]){
这个[a.id]={id:a.id};
tree.push(这个[a.id]);
}
此[a.id].data=a.data;
此[a.id].child=a.child.map(函数(b){
this[b]=this[b]|{id:b};
返回此[b];
},这个);
},Object.create(null));
document.write(“”+JSON.stringify(tree,0,4)+“”)代码>好的。。正如我所评论的,这是一个很好的问题,我很高兴对它进行一些思考。显然,这比展平嵌套对象数组要困难得多
顺便说一句,该算法不依赖于对象ID和数组中对象键之间的任何关联。具有任何id的对象可以位于数组中的任何位置
var obj=[{id:1,child:[2,4],数据:“你好”},{id:2,child:[3],数据:“我是第二位”},{id:3,child:[],数据:“我是第三位”},{id:4,child:[6],数据:“我是第四位”},{id:5,child:[],数据:“我是第五位”},{id:6,child:[],数据:“我是第六位”};
函数构造(平面){
函数嵌套(o){
o、 forEach(c=>{if(!!c.child.length){//coolness从这里开始
c、 child=c.child.map(e=>flat.splice(flat.findIndex(f=>f.id==e),1)[0]);
nest(c.child);
}
});
}
巢(平);
返回平面;
}
write(“+JSON.stringify(construct(obj),null,2)+”)对不起,很难理解你想做什么。到目前为止你试过什么?我唯一能看到的是两个对象数组。实际上这是一个好问题。我不明白投票失败的意义。@Brduca我必须把obj转换成newObj。谢谢,这就是我想要的!!你能告诉我每个循环的内部实际发生了什么吗。。。它是这样工作的;我们将一个平面数组传递给内部nest()
函数。如果当前元素(c
参数)有子元素(!!child.length
-!!is boolean conversion 0变为false,任何其他数字变为true),则nest
函数将逐个遍历传递数组的每个元素(forEach
循环)将c.child数组元素替换为平面数组中具有相应id(c.child.map)的对象,但是必须从平面数组中删除从平面数组移动到子数组的对象。这是由flat.splice完成的,它非常方便,因为它既删除了元素,又返回了删除的元素。因此,搜索具有正确id的元素(findIndex)会从平面数组中删除并返回索引元素,并将其映射到子数组中id所在的位置。因此,我们使用对象构造子数组。子数组现在类似于另一个平面数组,因为子数组中的元素可以包含它们的子元素。因此,我们对nest(child)进行递归调用,这一次对child数组也适用同样的情况。这就是内部嵌套函数Hi Nina的原因,Object.create(null)
在做什么?请解释一下?它创建了一个真正的空对象——一个没有任何原型的对象。我想知道我们为什么在这里这么做??哦,我明白了,这是循环的thisArgs。在用this
寻址的内部,有一个临时变量。
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"
}];