Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSON对象转换为JSON树_Javascript_Arrays_Json - Fatal编程技术网

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)+”)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"
}];