javascript - 在 JavaScript 中,有一种优雅的方法来合并两个对象并对任何公共(public)属性求和吗?

标签 javascript merge mapreduce duplicates

我正在对大量对象进行重复数据删除,其中许多对象具有一些共同的属性。所有属性都是整数。

循环遍历键并手动合并非常容易,但我忍不住觉得有 Object.assignmap 的某种组合>reduce 可以做到这一点是一行。随着语言的成熟,保持领先地位似乎是值得的。

编辑:举个例子:

let A = {
  "a": 10,
  "e": 2,
  "g": 14
}

let B = {
  "b": 3,
  "e": 15,
  "f": 1,
  "g": 2,
  "h": 11
}

let C = Object.magicMerge(A, B) 

/*
{
  "a": 10,
  "e": 17,
  "g": 16
  "b": 3,
  "f": 1,
  "h": 11
}
*/

最佳答案

vanilla JS 中实际上没有任何快捷方式,您必须显式地迭代每个对象和每个属性,并以某种方式对它们进行求和。一种选择是使用 reduce 进行分组:

const arr = [{
  foo: 1,
  bar: 2
}, {
  bar: 5,
  baz: 7
}, {
  baz: 10,
  buzz: 10
}];

const combined = arr.reduce((a, obj) =>
  Object.entries(obj).reduce((a, [key, val]) => {
    a[key] = (a[key] || 0) + val;
    return a;
  }, a)
, {});

console.log(combined);

我更喜欢reduce,因为外部combined变量一旦创建,就不会在其范围内发生变化,但您可以使用for..of 如果您愿意,可以改为:

const arr = [{
  foo: 1,
  bar: 2
}, {
  bar: 5,
  baz: 7
}, {
  baz: 10,
  buzz: 10
}];

const combined = {};
for (const obj of arr) {
  for (const [key, val] of Object.entries(obj)) {
    combined[key] = (combined[key] || 0) + val;
  }
}

console.log(combined);

关于javascript - 在 JavaScript 中,有一种优雅的方法来合并两个对象并对任何公共(public)属性求和吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58441263/

相关文章:

java - 如何从一个单元格检查所有可到达的单元格

linux - 如何 merge 存储在 mercurial 存储库中的 keepass 数据库?

javascript - 如何使用 jQuery 停止默认链接点击行为

javascript - 如何与 p5js 绘制循环并行运行代码?

javascript - addClass 函数工作正常,但removeClass 函数无法在表单的输入文本字段上工作?

C char 数组和指针 - 归并排序的合并

Hadoop DistCp 通过重命名处理相同的文件名

image-processing - 使用 hadoop 处理图像

hadoop - 映射后的多个(独立)reduce 函数

javascript - Bootstrap Confirmation data-on-confirm 不执行功能