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

标签 javascript arrays lodash javascript-objects

我有一组对象数组,如下所示:

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,因为我不确定如何去做。有什么建议吗?

最佳答案

代替 _.merge,您可以尝试使用 _.mergeWith它接受一个 customizer 函数,您可以使用它来自定义分配的值。

来自official docs :

This method is like _.merge except that it accepts customizer which is invoked to produce the merged values of the destination and source properties.

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>

关于javascript - 如何使用 lodash 合并/连接对象数组中相同对象属性的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54025657/

相关文章:

javascript - 初始化时数组 'glued'

javascript - 如何在 google-code-prettify 中包装长代码行

Javascript:setInterval 函数不起作用

arrays - 过滤对象数组中的两个值

javascript - 范围不是 lodash 中的函数?

javascript - Lodash 附加一个逗号

javascript - 触摸事件在 Chrome Devtools 中似乎工作正常,但在移动设备上没有响应

arrays - Swift 可变数组线程安全

java - 如何在特定字符之前分割字符串(以便分隔符位于结果的第二部分)

javascript - 合并具有相同属性的数组对象