在lodash中嵌套一个父子关系,给定父id和子
Nesting a parent child relationship in lodash, given the parent id and children
如果父类和子类作为属性给定,我如何能够嵌套json对象
数据如下:
"1": {
"id": 1,
"name": "foo",
"parent": null,
"root": 1,
"children": [2, 4, 6],
"posts":[
{ "id": "1", "name": "item1" },
{ "id": "2", "name": "item2" },
{ "id": "3", "name": "item3" }
]
},
"2": {
"id": 2,
"name": "bar",
"parent": 1,
"root": 1,
"children": null,
"posts":[
{ "id": "4", "name": "item4" }
]
},
"3": {
"id": 3,
"name": "bazz",
"parent": null,
"root": 3,
"children": [5, 7],
"posts":[
{ "id": "5", "name": "item5" },
{ "id": "6", "name": "item6" }
]
},
....
使用lodash的简单组是做不到的。
var group = _.groupBy(data, 'parent');
这是一把小提琴:
http://jsfiddle.net/tzugzo8a/1/问题的上下文是带有子类别的嵌套类别,类别中可以包含类别和帖子。
基本上我不希望有一个不同的属性为孩子和帖子,因为他们都是父的孩子。
期望输出值
"1": {
"id": 1,
"name": "foo",
"parent": null,
"root": 1,
"isCategory": true,
"children": [
{
"id": 2,
"name": "bar",
"parent": 1,
"root": 1,
"isCategory": true,
"children": null
},
{ "id": "1", "name": "item1", isCategory: false },
{ "id": "2", "name": "item2", isCategory: false },
{ "id": "3", "name": "item3", isCategory: false }
]
...
}
这是我对这个问题的看法:
var data = getData();
var group = getTree(data);
console.log(group);
function getTree(flat) {
return _.reduce(flat, function (treeObj, item, prop, flatTree) {
var children = _.map(item.children, function (childId) {
return _.set(flatTree[childId], 'isCategory', true);
}).concat(_.map(item.items, function(item) {
return _.set(item, 'isCategory', false);
}));
item.children = !!children.length ? children : null;
delete item.items;
item.parent === null && (treeObj[prop] = item);
return treeObj;
}, {});
}
看看更新后的小提琴:
var data = getData();
_.keys(data).forEach(function(id){
var element = data[id];
if (element.children === null){
element.children = [];
}
element.isCategory = true;
element.items.forEach(function(item){
item.isCategory = false;
})
});
_.keys(data).forEach(function(id){
var element = data[id];
element.children = element.children.map(function(childId){
return data[childId];
}).concat(element.items);
});
_.keys(data).forEach(function(id){
delete data[id].items;
});
console.log(JSON.stringify(_.findWhere(_.values(data), {'parent': null})));
相关文章:
- Wordpress标题和子菜单样式对IE的不满
- 使用量角器点击菜单和子菜单
- 基于类别和子类别总结JavaScript数组
- 动态创建嵌套的JSON对象父对象和子对象
- JavaScript—父类和子类/对象的此问题
- JS对象文字中的方法和子方法
- 为具有核心模块和子模块的应用程序构建Webpack
- 将json响应格式化为父级和子级
- 使用 php 将类别和子类别显示为两列
- 具有父主题和子主题的网站的MySQL结构
- 父关系指令和子关系指令之间的绑定
- 将值更改为动态父和子复选框
- 使用动态父和子复选框时出现问题
- 将“活动”类添加到父元素和子元素
- 如何决定和进行与父子关系对应的 REST 调用
- appendChild()是否终止子级与其当前父级之间的父子关系
- 在lodash中嵌套一个父子关系,给定父id和子
- Javascript/ jquery -通过父子关系和排序列将数组绑定到Html网格
- 从JSON中设置父和子关系
- 如何在javascript中动态创建具有许多父级和子级关系的Json