2016-03-02 217 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] 


      }