как сравнивать и заменять значения из одного массива в другой в js?

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

У меня есть массив объектов, каждый объект содержит 2 свойства, месяц и количество. значение count по умолчанию равно 0. У меня есть другой массив объектов, который я извлекаю из файла json с разными значениями количества. Я пытаюсь заменить значение счетчика из 2-го массива на 1-й.

например

 array1[
  { 
    month:1,
    count:0
  },
  { 
    month:2,
    count:0
  },
  { 
    month:3,
    count:0
  }
  { 
    month:4,
    count:0
  }
  etc...
]

array2[
  { 
    month:1,
    count:5
  },
  { 
    month:2,
    count:3
  },
  { 
    month:3,
    count:9
  }
  { 
    month:5,
    count:4
  }
  etc...
]
  

Моя проблема в том, что мой 2-й массив короче, так как отсутствует несколько месяцев (из-за отсутствия значений для них в БД), в этом случае я хотел бы пропустить и перейти к следующему объекту. таким образом, конечный результат будет выглядеть так,

 array1[
  { 
    month:1,
    count:5
  },
  { 
    month:2,
    count:3
  },
  { 
    month:3,
    count:9
  },
  { 
    month:4,
    count:0
  }
  { 
    month:5,
    count:4
  }
  etc...
]
  

мой код до сих пор

 var array1 = [];

for (var i = 1; i <= 12; i  ) {
  array1.push({
    month: i,
    count: 0
  })
}


$.getJSON(url, function (data) {
  for (var i = 0; i < data.length; i  ) {
    if (array1[i].month == data[i].month) { //work until month 4
        array1[i].count = data[i].count 
    }
});

console.log(array1);
  

Ответ №1:

Если у вас всегда есть месяцы года в вашем массиве, то вы можете использовать месяц в качестве индекса для исходного массива и обновлять при необходимости.

 for (var i = 0; i < data.length; i  ) {
    array1[data[i].month - 1].count = data[i].count;
}
  

Ответ №2:

Результат будет в первом массиве:

 function mergeArrays(arr1, arr2) {
    arr1.forEach(function(item1) {
        var item2 = arr2.find(function (item2) {
            return item2.month === item1.month;
        });
        if (item2) {
            Object.assign(item1, item2);
        }
    })
}