Сложение значений массива объектов javascript - PullRequest
3 голосов
/ 27 мая 2020

У меня есть массив таких объектов: const array=[{a:1, b:1} , {a:2, b:3} ,{a:1, b:1}]

Мне нужен массив вроде results = [{a: 4, b: 5}], который представляет собой сумму всех значений из массива объекты в соответствии с ключом.

Я пробовал что-то вроде этого, но иногда пропускал первый объект в массиве:

       array.reduce((acc, n) => {
          for (var prop in n) {
            if (acc.hasOwnProperty(prop)) acc[prop] += n[prop];
            else acc[prop] = 0;
          }
          return acc;
        }, {})

Ответы [ 4 ]

3 голосов
/ 27 мая 2020

Это будет работать

const res = [{a:1, b:1, c: 1} , {a:2, b:3, c:3} ,{a:1, b:1, c: 3}].reduce((a,v,i) => {
    for(let key in v) {
      a[key] = a[key] ? a[key] + v[key] : v[key];
    }
    return a
},{})

console.log(res)
3 голосов
/ 27 мая 2020

Вам необходимо инициализировать acc перед назначением, поэтому небольшая модификация ниже будет работать

 const array=[{a:1, b:1} , {a:2, b:3} ,{a:1, b:1}]
 const res = array.reduce((acc, n) => {
          for (var prop in n) {
          acc[prop] = acc[prop] || 0; // Need to initialize before assigning
            if (n.hasOwnProperty(prop)) {
                 acc[prop] += n[prop];
               } 
          }
          return acc;
        }, {})
console.log(res);
2 голосов
/ 27 мая 2020

Вы можете использовать этот код, и вам не нужно будет указывать свойства объекта вручную, он создаст новое свойство, если оно не существует, или добавит к существующему свойству, если оно существует.

var myarr = [{a: 2, b: 3}, {a:3, b:2}];
var newobj = {};

for (var i=0; i <= myarr.length; i += 1)   
  for (var p in myarr[i]) newobj[p] = (p in newobj) ? 
    newobj[p] + myarr[i][p] : myarr[i][p]
    
console.log(newobj);
0 голосов
/ 27 мая 2020

используйте forEach и Object.entries упростите.

const array = [
  { a: 1, b: 1 },
  { a: 2, b: 3 },
  { a: 1, b: 1 },
];

const acc = (arr) => {
  const res = {};
  arr.forEach((obj) =>
    Object.entries(obj).forEach(
      ([key, value]) => (res[key] = key in res ? res[key] + value : value)
    )
  );
  return [res];
};

console.log(acc(array));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...