如何使用lodash在对象数组中合并/连接相同对象属性的值?

拂晓

我有一个对象数组,看起来像这样:

let fruitSamples = [
  [
    {'id': 1,'type': 'apples','samples': [1, 2, 3]},
    {'id': 2,'type': 'bananas','samples': [1, 2, 7]},
    {'id': 3,'type': 'pears','samples': [1, 2, 3]}
  ],
  [
    {'id': 1,'type': 'apples','samples': [5, 2, 9]},
    {'id': 2,'type': 'bananas','samples': [1, 7, 7]},
    {'id': 3,'type': 'pears','samples': [12, 21, 32]}
  ],
  [
    {'id': 1,'type': 'apples','samples': [11, 2, 33]},
    {'id': 2,'type': 'bananas','samples': [17, 2, 67]},
    {'id': 3,'type': 'pears','samples': [91, 22, 34]}
  ]
];

我想使用lodash将上面的数组减少并合并为一个数组,以便将样本连接在一起,如下所示:

fruitSamples = [
  {'id': 1, 'type': 'apples', 'samples': [1,2,3,5,2,9,11,2,33]},
  {'id': 2, 'type': 'bananas', 'samples': [1,2,7,1,7,7,17,2,67]},
  {'id': 3, 'type': 'pears', 'samples': [1,2,3,12,21,32,91,22,34]},
]

我尝试了许多不同的方法,但由于我想以最短的途径解决此问题,您的建议是什么?

我已经试过了:

let test = _(fruitSamples)
  .flatten()
  .groupBy('type')
  .map(_.spread(_.merge))
  .value();

console.log(test);

这给了我以下结果,该结果没有将样本连接起来:

test = [
  {'id': 1,'type': 'apples','samples': [11, 2, 33]},
  {'id': 2,'type': 'bananas','samples': [17, 2, 67]},
  {'id': 3,'type': 'pears','samples': [91, 22, 34]}
]

我觉得使用_.mergeWith可能是正确的答案,如果是这样,我正在寻求以最佳方式实现mergeWith的帮助,因为我不确定该怎么做。有什么建议?

安娜丽莎·潘达克(Ana Liza Pandac)

相反的_.merge,你可以尝试使用_.mergeWith一个接受customizer,您可以使用自定义赋值函数。

官方文档

此方法_.merge与之类似,不同之处在于它接受定制程序,该定制程序被调用以生成目标属性和源属性的合并值。

let fruitSamples = [
  [
    {'id': 1,'type': 'apples','samples': [1, 2, 3]},
    {'id': 2,'type': 'bananas','samples': [1, 2, 7]},
    {'id': 3,'type': 'pears','samples': [1, 2, 3]}
  ],
  [
    {'id': 1,'type': 'apples','samples': [5, 2, 9]},
    {'id': 2,'type': 'bananas','samples': [1, 7, 7]},
    {'id': 3,'type': 'pears','samples': [12, 21, 32]}
  ],
  [
    {'id': 1,'type': 'apples','samples': [11, 2, 33]},
    {'id': 2,'type': 'bananas','samples': [17, 2, 67]},
    {'id': 3,'type': 'pears','samples': [91, 22, 34]}
  ]
];

function customizer(objValue, srcValue) {
  if (_.isArray(objValue)) {
    return objValue.concat(srcValue);
  }
}

let test = _(fruitSamples)
  .flatten()
  .groupBy('type')
  .map(_.spread((...values) => {
    return _.mergeWith(...values, customizer);
  }))
  .value();
  
console.log(test);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

合并数组IOS中的相同对象

如何使用lodash计算对象数组中的多个属性值?

如何在对象数组中合并值

在对象数组中合并带有“相同键”的对象

如何合并位于不同对象中的数组对象

将内部相同对象的属性中的值连接起来

使用Lodash按属性合并对象数组

如何通过嵌套在对象数组的属性中的对象属性的值在对象数组中查找多个索引?

如何从List对象中的新对象中设置属性值,并获得使用Java 8设置属性的相同对象的新List?

如何通过子属性对相同对象的数组进行排序?

如何使用 setState 重置出现在对象数组中的键的相同值?

使用 Lodash 从对象数组中删除相同的属性值重复项

我如何使用javascript中具有相同键的对象在对象中创建对象数组

Lodash查找数组中是否存在对象属性

如何在Swift中合并不同对象的数组

如何在对象中合并对象的属性

如何根据属性匹配来自不同对象数组的值?

如何使用 JavaScript 在对象数组中查找值?

如何在对象数组中获取对象所有属性值的数组?

如何基于相同的值合并对象数组?

按数组中的相同值合并对象

使用 lodash 将具有相同键的对象的值合并到一个数组中

Lodash在对象数组中的Map数组

删除数组中的相同对象

使用Lodash在对象的任何属性值中查找部分字符串

使用lodash在对象中查找属性的部分名称

如何使用lodash从对象属性数组中获取值?

如何使用lodash对对象数组中的属性进行分组?

如何在对象数组中设置每个对象的属性?