14

我有一个对象数组,其中每个对象都有一个“子”属性(下面的示例数据)。我想将父母/孩子扁平化成一个数组,每个父母紧随其后的是孩子。

我使用 lo-dash / underscore 编写了以下内容,并且当我为每个父母只有一个孩子时,它可以工作:

_.flatten(_.zip(myArr, _.flatten(myArr, "children")))

我知道我可以使用 _.each 之类的东西来构建一个对象,只是想知道是否有一种时髦的方法可以使用 _ 来做到这一点。

示例数据:

[{
    name: "Some Name",
    value: 1234,
    children: [{
        name: "Another name",
        value: 3456
    }, {
        name: "A third name",
        value: 9876
    }]
}, {
    name: "Omg Lazer Guns",
    value: 3333,
    children: [{
        name: "PewPewPew",
        value: 4444
    }]
}];
4

2 回答 2

20

一种简单且更具可读性的方法是

var list = [];
_.each(data, function(item){
    list.push(_.omit(item, 'children'));
    list.push(_.flatten(_.pick(item, 'children')));
});
var result = _.flatten(list);

结果是

[{
    "name": "Some Name",
    "value": 1234
}, {
    "name": "Another name",
    "value": 3456
}, {
    "name": "A third name",
    "value": 9876
}, {
    "name": "Omg Lazer Guns",
    "value": 3333
}, {
    "name": "PewPewPew",
    "value": 4444
}]
于 2013-08-02T03:33:08.090 回答
5

以您想要的方式合并数组的常用方法是对zip它们进行合并,您可以使用它们pluck来提取子项。像这样的东西:

var mangled = _(myArr).chain()
                      .zip(_(myArr).pluck('children'))
                      .flatten() 
                      .value()

如果 的任何顶级元素根本没有键,这将为您留下undefined条目。你可以抛出一个来摆脱那些:mangledmyArrchildrencompact

var mangled = _(myArr).chain()
                      .zip(_(myArr).pluck('children'))
                      .flatten()
                      .compact()
                      .value()

演示:http: //jsfiddle.net/ambiguous/aeS86/

当然,使用一对for循环和一些push调用进行修改可能会更快,但速度差异对于短数组应该无关紧要。

于 2013-08-01T20:56:05.227 回答