簡體   English   中英

將json row-items轉換為嵌套的javascript對象數組

[英]turn json row-items into nested javascript objects array

給定以下json對象數組:

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;
};

如何使用遞歸循環遍歷此items數組並構建一個新數組,如下所示:

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', [])
        ])
    ]);
];

任何幫助是極大的贊賞

編輯:父/子關系可以是無限的。 所以我正在尋找一個遞歸函數,將第一個“items”數組轉換為第二個“newarray”

你的問題的標題有點誤導。 您正在嘗試將項目數組轉換為樹狀嵌套對象。

您對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保存指向其條目的指針。 如果您不想這樣,請先創建items副本

我不知道這是否有幫助,但在這個小提琴中有一個迭代的解決方案,可以創建newArray。
使用json obj作為數組,然后在迭代items數組時添加子項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM