将json行项目转换为嵌套的javascript对象数组

turn json row-items into nested javascript objects array

本文关键字:javascript 对象 数组 嵌套 json 项目 转换      更新时间:2023-09-26

给定以下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的副本。

我不知道这是否有帮助,但在这个fiddle中有一个迭代解决方案可以创建那个newArray
使用json-obj作为数组,然后在迭代项数组时添加子项。