Underscore / Lodash - 来自父母/子女的对象

时间:2015-07-17 06:47:13

标签: recursion underscore.js lodash

我正在尝试从数据库(Mongo)中创建一个格式化的集合。

这是输入的格式:

[{_id:1,name:'1'},
 {_id:2,name:'2},
 {_id:3,name:'1-1',parent:1},
 ...
 {_id:50,name:'1-1-3',parent:3}]

正如你所看到的,'最深的祖先'是_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();

但它不能以递归的方式工作......

有人能帮助我吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以遍历集合以获得所需的结构:

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

此解决方案确实假设在每个子节点之前处理父节点,即子节点阵列在被推入之前创建。如果需要,有许多方法可以解决,但上面的代码显示了创建嵌套结构的方法。