Сумма массива объектов
Переберите каждый объект и вычислите сумму, назначив ее новому ключу:
let data = getData()
data.forEach(obj => {
obj.summaryIncome = obj.incomes.reduce((agg,{value}) => agg+=value, 0);
})
console.log(data);
function getData(){
return [
{id: 1, incomes: [{value:1, date:new Date()}, {value: 2, date:new Date()}]},
{id: 2, incomes: [{value:3, date:new Date()}, {value: 4, date:new Date()}]}
];
}
Это предполагает:
- исходные данные имеют значение
- исходные данные являются изменяемыми (можно хранить итоговые доходы вместе с ними)
- всегда есть ключ
incomes
и value
- , который использует
reduce
для перебора каждого значения и сбора совокупности agg
, в которой будет храниться сумма элемента - ваш браузер поддерживает ES6 или у вас есть транспортер для полифилов
Ваши проблемы
400 предметов - это не много предметов. Вы должны быть в состоянии легко повторить их; однако, ваше количество элементов и количество значений не являются единым массивом; это не 400x400, это 400x40. У вас нет того же числа идентификаторов, сколько у вас значений для каждого идентификатора. Таким образом, ваш i
подходит для вашего предмета l oop, но поскольку у вас меньше значений, чем предметов, вы достигнете конца.
Даже если бы они были одним и тем же числом, не похоже, что есть что-то, что связывает наблюдение с количеством доходов, поэтому настоятельно рекомендуется использовать только одну l oop и / или переменную для отслеживания индекса.
Пример реализации, в которой используются два цикла, см. в предыдущем разделе, в котором используются forEach
и reduce
для итерации обоих измерений ваших данных. Аналогично, ниже изменяется ваш исходный код, который будет демонстрироваться с использованием двух циклов for:
for(let item of data){
let sum = 0;
for(let {value} of item.incomes){
sum += value;
}
item.summaryIncome = sum
}