Сравнение двух массивов объектов JS

#javascript #arrays #comparison #equals

#javascript #массивы #сравнение #равно

Вопрос:

У меня есть два массива, которые состоят из пользовательских объектов. Они выглядят следующим образом:

 
courses: [
{Course: "Design", ECST: 5}, 
{Course: "Construction", ECTS: 10}
],

statistics: [
{Course: "Design", Hours: 2}, 
{Course: "Design", Hours: 2}, 
{Course: "Construction", Hours: 2},
{Course: "Construction", Hours: 2},
],


  

Я хочу вычислить сумму часов из массива «статистика» каждого курса. Проблема в том, что пользователь добавляет курсы, поэтому я не могу сказать === «Дизайн», но я должен сравнить их на основе добавленных курсов. Итак, мои вопросы таковы: Как я могу вычислить общее количество часов из каждого курса в массиве «статистика»? Есть ли способ просто сравнить уже добавленные курсы? Что-то вроде всех курсов, которые равны друг другу, получают часы?

Ответ №1:

Я не уверен, что полностью понял вашу проблему при чтении вопроса, но это звучит как то, что вы, вероятно, можете решить с помощью функции уменьшения. В этом примере мы пройдемся по каждой записи в статистике и объединим часы.

 const hoursPerCourse = statistics.reduce((acc, curr) => {
    acc[curr.Course] = acc[curr.Course] ? acc[curr.Course]   curr.Hours : curr.Hours

    return acc
}, {})
  

Вы также можете получить количество часов для каждого курса в массиве курсов из этих результатов, выполнив что-то вроде этого:

 courses.map((course) => ({
    ...course,
    hours: hoursPerCourse[course.Course]
}))
  

Ответ №2:

Вы можете просто попробовать так

 Array.prototype.sum = function(matchKey, matchValue, sumKey) {
  var total = 0
  for (var i = 0; i < this.length; i  ) {
    if (this[i][matchKey].toLowerCase() === matchValue.toLowerCase())
      total  = this[i][sumKey]
  }
  return total
}

console.log(statistic.sum('Course', 'design', 'Hours'))