我有一个对象数组,其中每个对象都有一个“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
}]
}];
答案 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
个密钥,那么myArr
个children
条目就会离开var mangled = _(myArr).chain()
.zip(_(myArr).pluck('children'))
.flatten()
.compact()
.value()
。你可以扔掉compact
来摆脱那些:
for
演示:http://jsfiddle.net/ambiguous/aeS86/
当然,使用一对{{1}}循环和一些push
调用进行修改可能会更快,但速度差异与短数组无关。