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

Sco*_*lvi 12 underscore.js

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

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

_.flatten(_.zip(myArr, _.flatten(myArr, "children")))
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用类似_.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
    }]
}];
Run Code Online (Sandbox Code Playgroud)

zs2*_*020 21

一种简单易读的方法是

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

结果是

[{
    "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
}]
Run Code Online (Sandbox Code Playgroud)


mu *_*ort 5

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

var mangled = _(myArr).chain()
                      .zip(_(myArr).pluck('children'))
                      .flatten() 
                      .value()
Run Code Online (Sandbox Code Playgroud)

如果任何顶级元素根本没有键,那将留下undefined条目.你可以投入一个去除那些:mangledmyArrchildrencompact

var mangled = _(myArr).chain()
                      .zip(_(myArr).pluck('children'))
                      .flatten()
                      .compact()
                      .value()
Run Code Online (Sandbox Code Playgroud)

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

当然,使用一对耦合for循环和一些push调用进行修改可能会更快,但速度差异对于短阵列无关紧要.