将json行项目转换为嵌套javascript对象数组
给定以下json对象数组:将json行项目转换为嵌套javascript对象数组,javascript,recursion,Javascript,Recursion,给定以下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, lev
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”我不知道这是否有用,但是这里有一个迭代的解决方案来创建新的数组。
使用json obj作为数组,然后在迭代items数组时添加子元素。您问题的标题有点误导。您正在尝试将项目数组转换为树状嵌套对象 使用
对象
构造函数有点多余。改为使用准文字符号({foo:bar}
)。实际上,您甚至不需要创建新对象,您可以使用原始对象
首先,将列表转换为对象以便于按id进行引用:
var map = {}
for (var i = 0; i < items.length; i++) {
map[items[i].id] = items[i];
}
请注意,这将修改原始的
项
数组,并且新数组
保存指向其项的指针。如果您不想这样做,请先创建一组项目。对不起,我不太清楚您的要求;你的原始数组是否只包含一个级别的对象数组?你能提供你已经开始的代码吗?这和我接受的答案一样有效。我有限的js知识让我很难理解如何使用@marspzb在jfiddle示例中演示的代码。但也谢谢你的回答,错别字?可能是(映射中的变量id){
而不是(映射中的id){
的?此解决方案不使用递归,因此并不总是有效。根据项目的顺序,它可能会中断。
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);
}
}