将多个对象合二为一,将值一起添加

Lus*_*ney 3 javascript arrays object

假设我有一个对象数组:

[
    {
        category: 'Category A',
        mainUnits: 5,
        subUnits: 3
    },

    {
        category: 'Category A',
        mainUnits: 9,
        subUnits, 12
    },

    {
        category: 'Category B',
        mainUnits: 4,
        subUnits, 6
    },

    {
        category: 'Category B',
        mainUnits: 2,
        subUnits, 4
    }
]
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法获得如下所示的数组:

[
    {
        category: 'Category A',
        mainUnits: 14,
        subUnits: 15
    },

    {
        category: 'Category B',
        mainUnits: 6,
        subUnits: 10
    }
]
Run Code Online (Sandbox Code Playgroud)

我已经取得了一些进展,但不能完全得到我需要的确切结果.非常感谢任何指导,谢谢!

CRi*_*ice 7

.reduce阵列的方法似乎是一个不错的选择这里.

使用数组.find方法查看结果中是否已存在具有该类别的项目.如果是,请添加字段,但如果不是,请将项添加到结果中:

const input = [{
  category: 'Category A',
  mainUnits: 5,
  subUnits: 3
}, {
  category: 'Category A',
  mainUnits: 9,
  subUnits: 12,
}, {
  category: 'Category B',
  mainUnits: 4,
  subUnits: 6,
}, {
  category: 'Category B',
  mainUnits: 2,
  subUnits: 4,
}];

const result = input.reduce((result, item) => {
  const existing = result.find(x => x.category === item.category);
  if (existing) {
    existing.mainUnits += item.mainUnits;
    existing.subUnits += item.subUnits;
  } else {
    result.push(item);
  }

  return result;
}, []);

console.log(result);
Run Code Online (Sandbox Code Playgroud)


Jet*_*eto 5

@ CRice的答案很棒,但如果你愿意,这是另一种方法:

const input = [{
  category: 'Category A',
  mainUnits: 5,
  subUnits: 3
}, {
  category: 'Category A',
  mainUnits: 9,
  subUnits: 12
}, {
  category: 'Category B',
  mainUnits: 4,
  subUnits: 6
}, {
  category: 'Category B',
  mainUnits: 2,
  subUnits: 4
}];

let sums = {};
for (let entry of input) {
  sums[entry.category] = sums[entry.category] || {
    mainUnits: 0,
    subUnits: 0
  };
  sums[entry.category].mainUnits += entry.mainUnits;
  sums[entry.category].subUnits += entry.subUnits;
}

const result = Object.keys(sums).map(category => Object.assign({
  category
}, sums[category]));

console.log(result);
Run Code Online (Sandbox Code Playgroud)