将JSON对象转换为JSON树

时间:2016-04-29 10:13:40

标签: 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,
    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中编码?

任何帮助都会有所体现。提前谢谢。

Jsfiddle

2 个答案:

答案 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>");