Underscore/Lodash - 来自 parent/children 的对象
Underscore/Lodash - Object from parent/children
我正在尝试根据从数据库 (Mongo) 获得的集合创建格式化集合。
输入格式如下:
[{_id:1,name:'1'},
{_id:2,name:'2},
{_id:3,name:'1-1',parent:1},
...
{_id:50,name:'1-1-3',parent:3}]
如你所见,'deepest ancestors' 是 _ids 1 和 2。子节点的第一个节点包含 _id 3,它有一个子节点,_id 50。
我正在努力创建这种集合,使用 Lodash :
[{
_id:1,name:'1',children:[
{_id:3,name:'1-1',children:[
...,
{_id:50,name:'1-1-3',children:[]}
]},
...
]
},{
_id:1,name:'1',children:[...]
}]
这是我试过的方法:
var result=_.chain(input)
.groupBy('parent')
.pairs()
.map(function(currentItem){
return _.object(_.zip(['parent','children'],currentItem))
})
.value();
但它不能以递归方式工作...
有人能帮我吗?
谢谢。
您可以遍历集合以获得所需的结构:
// create and indexed object with the _id field as key - improve performance
var indexed = _.indexBy(data, '_id');
// iterate to create the structure
_.each( data, function(datum){
datum.children = [];
if( _.has(datum,'parent')){
indexed[datum.parent].children.push(datum);
}
})
此解决方案确实假设在每个子项之前先处理父项,即在将其推入之前创建子数组。如果需要,有多种方法可以解决,但上面的代码显示了创建嵌套结构的方法。
我正在尝试根据从数据库 (Mongo) 获得的集合创建格式化集合。
输入格式如下:
[{_id:1,name:'1'},
{_id:2,name:'2},
{_id:3,name:'1-1',parent:1},
...
{_id:50,name:'1-1-3',parent:3}]
如你所见,'deepest ancestors' 是 _ids 1 和 2。子节点的第一个节点包含 _id 3,它有一个子节点,_id 50。
我正在努力创建这种集合,使用 Lodash :
[{
_id:1,name:'1',children:[
{_id:3,name:'1-1',children:[
...,
{_id:50,name:'1-1-3',children:[]}
]},
...
]
},{
_id:1,name:'1',children:[...]
}]
这是我试过的方法:
var result=_.chain(input)
.groupBy('parent')
.pairs()
.map(function(currentItem){
return _.object(_.zip(['parent','children'],currentItem))
})
.value();
但它不能以递归方式工作...
有人能帮我吗?
谢谢。
您可以遍历集合以获得所需的结构:
// create and indexed object with the _id field as key - improve performance
var indexed = _.indexBy(data, '_id');
// iterate to create the structure
_.each( data, function(datum){
datum.children = [];
if( _.has(datum,'parent')){
indexed[datum.parent].children.push(datum);
}
})
此解决方案确实假设在每个子项之前先处理父项,即在将其推入之前创建子数组。如果需要,有多种方法可以解决,但上面的代码显示了创建嵌套结构的方法。