Tengo dos matrices:
const data = [ 250, 250, 500, 500 ] const labels = [ '2022-05-10', '2022-06-10', '2022-07-10', '2022-07-10' ] Cada fecha en la matriz de labels tiene un valor correspondiente en la matriz de data , y necesito sumar los valores para cada día que sea igual, por lo que el resultado debería verse así:
const data = [ 250, 250, 1000 ] const labels = [ '2022-05-10', '2022-06-10', '2022-07-10' ]¿Cómo puedo hacer esto?
const labels = ['2022-05-10', '2022-06-10', '2022-07-10', '2022-07-10']; const data = [250, 250, 500, 500]; const restructure = (keysArray, valuesArray) => keysArray.reduce((accumu, current, index) => { current = { [current]: valuesArray[index] }; for (const [key, val] of Object.entries(current)) { accumu[key] = (accumu[key] ?? 0) + val; } return accumu; }, {}); const prettyPrint = (title, obj) => console.log(`${title} =>`, JSON.stringify(obj)); const result = restructure(labels, data); prettyPrint('labels', Object.keys(result)); prettyPrint('data', Object.values(result)); const data = [ 250, 250, 500, 500 ]; const labels = [ '2022-05-10', '2022-06-10', '2022-07-10', '2022-07-10' ]; var newData = new Array(); var newLabels = new Array(); labels.forEach(myFunction); newLabels.forEach(myFunction2); function myFunction(item,index) { console.log(item + ',' + index); if(!newLabels.includes(item) ) { newLabels.push(item); newData.push(data[index]); } else { var newIndex = newLabels.indexOf(item); console.log(newIndex); var added = newData[newIndex] + data[index]; newData[newIndex] = added; } } function myFunction2(item,index){ console.log(item + ',' + index); console.log(newData[index]); }Mi javascript está bastante oxidado, pero esto une las dos matrices y luego crea un objeto donde agrego al objeto si esa clave ya existe, o lo creo si no existe. (¿Eso podría ser lo que hace una respuesta de reduce adecuada?)
zip = (...rows) => [...rows[0]].map((_, c) => rows.map(row => row[c])) let data = [250, 250, 500, 500] let labels = ['2022-05-10', '2022-06-10', '2022-07-10', '2022-07-10'] const values = zip(labels, data) const output = {} for (const [date, value] of values) { if (Object.keys(output).includes(date)) { output[date] += value } else { output[date] = value } } data = Object.values(output) labels = Object.keys(output) console.log(data) console.log(labels)