#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);