我有一个对象数组,其中每个对象都有一个"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)
按照您想要的方式合并数组的常用方法是使用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调用进行修改可能会更快,但速度差异对于短阵列无关紧要.