Как перебрать массив объектов и суммировать значения?

Есть arrayOfSizez массив объектов следующего вида:

[{height: 12312, offset: 21}, {height: 12312, offset: 21}, {height: 12312, offset: 21}.....]
Мне нужно суммировать все height и offset отдельно. Как это сделать?

Следующий вопрос: цикл этого вида:

for (let i = 1; i < arrayOfSizes.length; i++) {
          if (arrayOfSizes[i].offset < arrayOfSizes[i - 1].offset) {
            offset += arrayOfSizes[i].offset;
          }
        }

Нужно переписать через reducer, примерно такого вида:

const offset = arrayOfSizes.reduce(
          (prev: any, val: any, i: any, arr: any) =>
            val.offset < arr[i].offset ? prev + val.offset : prev,
          0,
        );

Пока что то не так, помогите пожалуйста


Ответы (2 шт):

Автор решения: fortavey

Не совсем понятно в каком виде Вам его нужно вернуть. Например так собрать все суммы в один объект.

const result = arrayOfSizez.reduce((acc, el) => {
   acc.height += el.height;
   acc.offset += el.offset;
   return acc;
})

console.log(result);

Если нужно сохранить нетронутым исходный массив можно сделать так:

const result = arrayOfSizez.reduce((acc, el) => {
   acc.height = acc.height ? acc.height+el.height : el.height;
   acc.offset = acc.offset ? acc.offset+el.offset : el.offset;
   return acc;
}, {})

Или так:

const result = JSON.parse(JSON.stringify(arrayOfSizez)).reduce((acc, el) => {
   acc.height += el.height;
   acc.offset += el.offset;
   return acc;
})
→ Ссылка
Автор решения: Максим Вишневский

Думаю данное решение будет оптимальным:

const values = [
  { height: 12312, offset: 21 },
  { height: 12312, offset: 21 },
  { height: 12312, offset: 21 },
];

const getHeightAndOffsetSums = (items) => items
  .reduce((acc, { height, offset }) => {
    acc.heightSum += height;
    acc.offsetSum += offset;

    return acc;
  }, { heightSum: 0, offsetSum: 0 });

console.log(getHeightAndOffsetSums(values));

→ Ссылка