Уменьшить массивы в объектах, которые в большом массиве JS - PullRequest
0 голосов
/ 17 марта 2020

У меня есть вложенный массив, состоящий из множества объектов (400 элементов). Эти объекты имеют свойство ID и свойство доходов. Это свойство доходов представляет собой массив объектов (40 элементов), которые имеют значение и дату. Вопрос в том, как я могу выполнить итерацию по этому основному массиву, чтобы суммировать все значения моего небольшого массива в одну сводку?

[{id: 1-400, incomes:[{value: "String", date: "String"}]}]

И, например, эта сводка будет третьим свойством основного массива:

[{id: 1-400, incomes:[{value: "String", date: "String"}], summaryIncome: "number"}]

Я могу выполнить итерацию для этих 400 элементов с помощью for в l oop, но Я не понимаю, как я могу выполнить итерацию как для больших 400 элементов, так и для небольших 40 элементов массива с одним l oop.

 for(let i in data){
   data[i].incomes[i].value
}

Так что i будет> 40, и я получу неопределенное значение в доходы [я] .value. Пожалуйста, помогите:)

Ответы [ 2 ]

3 голосов
/ 17 марта 2020
var a = [
  {id: 1, incomes: [{value:1}, {value: 2}]}, 
  {id: 2, incomes: [{value:2}, {value: 3}]}];

var b = a.map(item => ({
  ...item,
  summaryIncome: item.incomes.reduce((t, income) =>
    t += income.value, 0)
}));

console.log(b);

Это должно напечатать:

{id: 1, incomes: Array(2), summaryIncome: 3}
{id: 2, incomes: Array(2), summaryIncome: 5}
1 голос
/ 17 марта 2020

Сумма массива объектов

Переберите каждый объект и вычислите сумму, назначив ее новому ключу:

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
}
...