Как перебрать массив объектов и суммировать значения?
Есть arrayOfSizez массив объектов следующего вида:
[{height: 12312, offset: 21}, {height: 12312, offset: 21}, {height: 12312, offset: 21}.....]
Следующий вопрос: цикл этого вида:
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));