![](/img/trans.png)
[英]count occurrences of items in an array from an nested items in an array of objects 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.