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);
    }
})

此解决方案确实假设在每个子项之前先处理父项,即在将其推入之前创建子数组。如果需要,有多种方法可以解决,但上面的代码显示了创建嵌套结构的方法。