将json行项目转换为嵌套的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
的副本。
我不知道这是否有帮助,但在这个fiddle中有一个迭代解决方案可以创建那个newArray
使用json-obj作为数组,然后在迭代项数组时添加子项。
相关文章:
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 循环遍历以数组为值的Javascript对象
- 从ajax请求中获取javascript对象
- 如何从对象的原型方法访问JavaScript对象属性
- 将XML转换为普通的旧JavaScript对象
- 通过引用传递JavaScript对象
- javascript对象操作:根据指定条件选择属性
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 如何在异步函数中使用javascript对象
- 临时Javascript对象
- 如何在ASP中为用户控件添加Javascript对象网
- 使用数组向下搜索Javascript对象
- Rails将JavaScript对象存储到Model的有效方式
- JavaScript对象不是从原型链继承的
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- SetInterval在javascript对象中表现怪异
- Javascript 对象和 this 关键字
- 如何在不知道关键字的情况下访问javascript对象值
- 在 JavaScript 对象中设置要使用的运算符的属性
- 如何搜索JavaScript对象并更改值