下划线以展平父/子对象的嵌套数组

时间:2013-08-01 19:40:46

标签: underscore.js

我有一个对象数组,其中每个对象都有一个“children”属性(下面的示例数据)。我想把父母/孩子压成一个单独的阵列,每个父母都紧跟着它的孩子。

我使用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
    }]
}];

2 个答案:

答案 0 :(得分: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
}]

答案 1 :(得分:5)

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

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

如果undefined的任何顶级元素根本没有mangled个密钥,那么myArrchildren条目就会离开var mangled = _(myArr).chain() .zip(_(myArr).pluck('children')) .flatten() .compact() .value() 。你可以扔掉compact来摆脱那些:

for

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

当然,使用一对{{1}}循环和一些push调用进行修改可能会更快,但速度差异与短数组无关。