Lodash:由一组对象的属性联合

时间:2017-04-24 16:49:15

标签: lodash

我有一个对象数组,它有一个我试图联合在一起的数组属性。我已经用下面的代码解决了这个问题,它显示了我想要做的事情:

var dest = [];
_.forEach(parentArray, function (parentItem) {
    _.forEach(parentItem.arrayProperty, function(arrayPropertyItem) {
        dest.push(arrayPropertyItem);
    });
});

这很好用。但我想知道lodash是否有任何快捷方法。我尝试使用unionBy / unionWith,但它似乎没有预期的结果。而只是简单地让我回到parentArray。

2 个答案:

答案 0 :(得分:3)

查看flatMapflatten。如果我了解您的数据结构(以及您要完成的任务),您应该能够做到这样的事情

var dest = _.flatMap(parentArray, function(item) {
  return item.arrayProperty;
});

如有必要,您可以_.flatten使用item.arrayProperty,具体取决于您要完成的工作。如果arrayProperty包含数组数组,则输出也将具有嵌套数组。如果它更深入,您可能需要使用flattenDeep

var parentArray = [{item: 'one', children: [1, 2, 3]}, {item: 'two', children: [4, 5, 6]}];

var dest = _.flatMap(parentArray, function(item) {
  return item.children;
});

console.log(dest);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

您可以通过在children属性中添加嵌套数组并在必要时添加_.flatten来解决这个问题。

答案 1 :(得分:2)

您可以将flatMap与嵌套属性的名称一起用作第二个参数:

_.flatMap(parentArray, 'arrayProperty')

var parentArray = [{
    arrayProperty: [1, 2]
}, {
    arrayProperty: [3, 4]
}];

console.log( _.flatMap(parentArray, 'arrayProperty') );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>