2012-04-01 96 views
2

考慮下面的JSON對象數組:將JSON行項目到嵌套JavaScript對象數組

var items = [ 
    {id:1, parentId:0, name:'item1'}, 
    {id:2, parentId:1, name:'item1.2'}, 
    {id:3, parentId:1, name:'item1.3'}, 
    {id:4, parentId:3, name:'item3.4'}, 
    {id:5, parentId:3, name:'item3.5'}, 
    ...more nesting, levels, etc. 
]; 

和基本對象,如:

var myObj = function(id, parentId, name, children){ 
    this.id = id; 
    this.parentId = parentId; 
    this.name = name; 
    this.children = children; 
}; 

我怎麼通過這個用遞歸循環項目數組,並建立一個新的數組,像這樣:

var newArray = [ 
    new myObj(1, 0, 'item1', [ 
     new myObj(2, 1, 'item1.2', []), 
     new myObj(3, 1, 'item1.3', [ 
      new myObj(4, 3, 'item3.4', []), 
      new myObj(5, 3, 'item3.5', []) 
     ]) 
    ]); 
]; 

任何幫助是極大的讚賞

編輯: 父母/子女關係可以是無限的。所以我正在尋找一個遞歸函數,將第一個「項目」數組轉換爲第二個「newarray」

+1

對不起,我不太清楚你的要求;您的原始數組是否僅包含一個級別的對象數組? – 2012-04-01 00:20:54

+0

你能提供你已經開始的代碼嗎? – 2012-04-01 00:29:23

回答

3

我不知道這是否有幫助,但在這fiddle有一個迭代解決方案,創建該newArray。
使用json obj作爲數組,然後在遍歷items數組時添加子項。

+0

此解決方案不使用遞歸,因此它不總是工作。根據物品的順序可能會中斷。 – Paul 2015-01-12 22:34:37

5

您的問題的標題有點誤導。您試圖將項目數組轉換爲樹狀嵌套對象。

您使用Object構造函數有點多餘。改用準文字符號({foo:bar})。實際上,你甚至不需要創建新的對象,你可以使用原來的對象。

首先,列表轉換爲對象,以方便ID引用:

var map = {} 
for (var i = 0; i < items.length; i++) { 
    map[items[i].id] = items[i]; 
} 

現在,通過項目迭代,並添加子陣列:

var newArray = []; 
for (id in map) { 
    var item = map[id]; 
    var parent = map[item.parentId]; 
    if (parent) { 
     parent.children = parent.children || []; 
     parent.children.push(item); // add reference to item 
    } else { // root 
     newArray.push(item); 
    } 
} 

注意,這個修改原始items數組,並且newArray保存指向其條目的指針。如果你不想要,首先創建一個copyitems

+0

這和我接受的答案一樣有效。我有限的js知識使得很難弄清楚如何處理你的代碼@marspzb在例子jfiddle中展示了什麼。但感謝您的回答以及 – Andre 2012-04-01 16:09:17

+0

錯字?也許'爲(var id在地圖){'而不是'for(id在地圖){'? – pupadupa 2013-06-28 22:42:08