tengo dos matrices
array1 = ['jan', 'mar', 'dec', 'jan', 'sep', 'nov', 'mar']; array2 = [3, 5, 5, 4, 5, 8, 2];como se ve, cada mes puede aparecer más de una vez.
me gustaría agrupar/ordenar estos datos para tener 2 matrices que muestren el mes y los valores totales correspondientes, en esencia, obtener todos los valores que corresponden a enero, sumarlos y enviarlos a otra matriz, febrero debe sumar todos los valores de febrero y enero también y así sucesivamente. así como una cuarta matriz que contiene meses, sin repeticiones. algo como
array3 = ['jan', 'mar', 'sep', 'nov', 'dec']; array4 = [7, 14, 19, 24, 32]; //totalsUna forma es crear un objeto plano temporal, codificado por los nombres de los meses y un entero correspondiente que inicialmente se establece en 0. Luego agregue a esos enteros los valores tal como aparecen en la segunda matriz, correspondiente al mes. Finalmente desglose ese objeto en sus claves y valores:
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 => [month, 0])); array1.forEach((month, i) => temp[month] += array2[i]); array1 = Object.keys(temp); array2 = Object.values(temp); console.log(JSON.stringify(array1)); console.log(JSON.stringify(array2));Primero necesita una matriz de todos los meses, luego recorra esa matriz para obtener la suma que está debajo de ese mes.
Para los datos de ejemplo,
novdebe ser27en lugar de24ya que la suma total32menosdec(que es5) es27
// 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) => { if(array1.includes(curMonth)) { sums[curMonth] = array2.reduce((acc, value, index) => acc + (months.indexOf(array1[index]) <= i && 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);