Кластеризация двух массивов объектов javascript

#javascript #node.js

#язык JavaScript #node.js

Вопрос:

У меня есть два массива

 array1 = ['jan', 'mar', 'dec', 'jan', 'sep', 'nov', 'mar']; array2 = [3, 5, 5, 4, 5, 8, 2];  

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

я хотел бы сгруппировать/отсортировать эти данные, чтобы иметь 2 массива, которые показывают месяц и соответствующие суммарные значения, по сути, получить все значения, соответствующие январю, суммировать их и вывести в другой массив, февраль также должен суммировать все значения февраля и значения января и так далее. а также четвертый массив, содержащий месяцы, без повторов. что-то вроде

 array3 = ['jan', 'mar', 'sep', 'nov', 'dec']; array4 = [7, 14, 19, 24, 32]; //totals  

Комментарии:

1. Как получилось, что порядок 'nov' и 'dec' изменился?

2. Данные представлены в случайном формате

3. Хорошо, но почему порядок изменен ?

Ответ №1:

Один из способов-создать временный простой объект, обозначенный именами месяцев, и соответствующее целое число, которое изначально равно 0. Затем добавьте к этим целым числам значения, как они отображаются во втором массиве, соответствующие месяцу. Наконец, разбейте этот объект на его ключи и значения:

 var array1=['jan','mar','dec','jan','sep','nov','mar']; var array2=[3,5,5,4,5,8,2];  var temp = Object.fromEntries(array1.map(month =gt; [month, 0])); array1.forEach((month, i) =gt; temp[month]  = array2[i]); array1 = Object.keys(temp); array2 = Object.values(temp);  console.log(JSON.stringify(array1)); console.log(JSON.stringify(array2)); 

Ответ №2:

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

Для примера данных nov должно быть 27 вместо 24 , так как общая сумма 32 минус dec (которая есть 5 ) равна 27

 // month map const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];  const array1 = ['jan','mar','dec','jan','sep','nov','mar'] const array2 = [3,5,5,4,5,8,2];  const result = months.reduce((sums, curMonth, i) =gt; {  if(array1.includes(curMonth)) {  sums[curMonth] = array2.reduce((acc, value, index) =gt; acc   (months.indexOf(array1[index]) lt;= i amp;amp; value), 0);  }  return sums; }, {});  console.log(result);  // get desired two arrays according to the result const array3 = Object.keys(result); const array4 = Object.values(result);  console.log(array3); console.log(array4);