2016-03-02 159 views
1

我试图更改json文件的结构。以下是当前结构正在使用的功能。我试图改变当前的功能,所以JSON的右键和左键将被合并为小孩。但是,我面临着困难。你们可以帮我修改代码或者提出一个有效的方法来执行这个功能吗?更改嵌套JSON的结构

var buildTree = function(jsonObj){ 

     if(!jsonObj) 
      return; 
     for(var n in jsonObj){ 
      that.topicList.push(n); 
      return{ 
       key : n, 
       right : buildTree(jsonObj[n][0]), 
       left : buildTree(jsonObj[n][1]) 
      } 
     } 
    } 

此代码的输入:

{ 
"math": [{ 
    "Math": [] 
}, { 
    "A Greek–English Lexicon": [{ 
     "A-list": [] 
    }, { 
     "ASCII": [] 
    }] 
}] 
} 

电流输出:

{ 
"key": "math", 
"right": { 
    "key": "Math" 
}, 
"left": { 
    "key": "A Greek–English Lexicon", 
    "right": { 
     "key": "A-list" 
    }, 
    "left": { 
     "key": "ASCII" 
    } 
} 
} 

我想把上述输出变化成一个象下面这样:

​​3210
+0

请添加原始对象。 –

+0

请你可以编辑问题,为此添加输入?它可以更容易地直观地显示代码正在做什么。 – Rhumborl

回答

1

这是一个递归方法,返回一个新的对象。

var object = { "math": [{ "Math": [] }, { "A Greek–English Lexicon": [{ "A-list": [] }, { "ASCII": [] }] }] }, 
 
    newObject = {}; 
 

 
function restyle(obj) { 
 
    var k = Object.keys(obj)[0]; 
 
    return { 
 
     key: k, 
 
     child: obj[k].map(restyle) 
 
    }; 
 
}; 
 

 
newObject = restyle(object); 
 
document.write('<pre>' + JSON.stringify(newObject, 0, 4) + '</pre>');

这是一种递归方法,它改变对象原位

function restyle(o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     o.key = k; 
 
     o.child = o[k]; 
 
     delete o[k]; 
 
     o.child.forEach(restyle); 
 
    }); 
 
}; 
 

 
var object = { "math": [{ "Math": [] }, { "A Greek–English Lexicon": [{ "A-list": [] }, { "ASCII": [] }] }] }; 
 
restyle(object); 
 
document.write('<pre>' + JSON.stringify(object, 0, 4) + '</pre>');

+0

你的答案是特定的,而不是所有输入通用的 – prajnavantha

+0

@prajnavantha,你是什么意思*特定*? –

+0

哎呀对不起那里交配......我没有看到代码输出前正确评论。它工作正常,甚至更短,更好,然后我的版本。 – prajnavantha

0

我写了一个解决方案。你基本上需要做递归编程。如果出现错误,您可能需要做一些基本的更改,但基本上我已经编写了逻辑和代码。 它将通过子元素递归解析,直到找到一个空数组,即叶节点。我假设将永远只有两个孩子,因为它看起来像一棵简单的树。

  /*Initially the object is pased here*/ 
      function parse(obj){ 
       /*Im assuming that the object has a key and value you need to add other failure checks here*/ 
       var keys =Object.keys(obj) 
       return { 
        "name": keys[0] 
        "child" getChilds(obj[keys[0]]) 
       } 
      } 

      /*This is a recursive function which will grab left and right child and finally return the output.*/ 
      function getChilds(arr){ 


        if(arr.length === 0){ 
         return [] 
        } 
        var obj = arr[0] 
        var keys =Object.keys(obj) 


        var newObj = {} 
        /*left child*/ 
        var left = { 
         "name":keys[0], 
         "child":getChilds(obj[keys[0]]) 
        } 

        var obj = arr[1] 
        var keys =Object.keys(obj) 
        /*right child*/ 
        var right = { 
         "name":keys[0], 
         "child":getChilds(obj[keys[0]]) 
        } 

        return [left,right] 


      }