Necesito ayuda para sumar valores dentro de una matriz en orden
Tengo dos matrices:
array1 = ['car', 'car', 'ball', 'piano', 'car'] array2 = ['2500', '1000', '400', '2500', '4500']Estoy usando este código a continuación para eliminar los valores duplicados dentro de array1:
var uniqueValues = []; for(var i in array1){ if(uniqueValues.indexOf(array1[i]) === -1){ uniqueValues.push(array1[i]); } } //returns ['car', 'ball', 'piano']Lo que necesito es sumar los valores de array2 usando el orden de array1, así tendré este resultado:
result = ['8000', '400', '2500']Así que el resultado final sería este:
array1 = ['car', 'ball', 'piano'] array2 = ['8000', '400', '2500']Cualquier sugerencia ? gracias.
(1) Use Array#reduce() y Object.assign() para construir un objeto con claves únicas (y valores sumados):
{ car: 8000, ball: 400, piano: 2500 } (2) Use Object.keys() para obtener una nueva array1 :
[ 'car', 'ball', 'piano' ] (3) Use Object.values() para obtener una nueva array2 :
[ 8000, 400, 2500 ]DEMO 1
let array1 = ['car', 'car', 'ball', 'piano', 'car']; let array2 = ['2500', '1000', '400', '2500', '4500']; const result = array1.reduce((acc, cur, index) => Object.assign(acc, { [cur]: (acc[cur] || 0) + +array2[index] }), {}); array1 = Object.keys(result); array2 = Object.values(result); console.log(array1); console.log(array2); También puede devolver un objeto literal directamente en Array#reduce() de la siguiente manera:
const result = array1.reduce((acc, cur, index) => ({ ...acc, [cur]: ((acc[cur] || 0) + +array2[index]) }), {});DEMO 2
let array1 = ['car', 'car', 'ball', 'piano', 'car']; let array2 = ['2500', '1000', '400', '2500', '4500']; const result = array1.reduce((acc,cur,index) => ({...acc,[cur]:((acc[cur] || 0) + +array2[index])}), {}); array1 = Object.keys(result); array2 = Object.values(result); console.log(array1); console.log(array2);Reducir hará el truco
NOTA ¿JavaScript garantiza el orden de las propiedades de los objetos?
let array1 = ['car', 'car', 'ball', 'piano', 'car'] let array2 = ['2500', '1000', '400', '2500', '4500'] const merged = array1.reduce((acc,cur,i) => { acc[cur] = (acc[cur] || 0) + +array2[i]; // add after casting to number return acc },{}) console.log(merged) array1 = Object.keys(merged) array2 = Object.values(merged) console.log(array1) console.log(array2)No es exactamente la mejor solución, pero debería funcionar. He usado el mapa para crear un índice y agregar los valores. Es uno simple.
let array1 = ['car', 'car', 'ball', 'piano', 'car', 'ball', 'piano']; let array2 = ['2500', '1000', '400', '2500', '4500', '2500', '4500']; const MapOfItems = new Map(); array1.forEach(function(item, index) { if (MapOfItems.has(item)) MapOfItems.set(item, MapOfItems.get(item) + +array2[index]); else MapOfItems.set(item, +array2[index]); }); console.log(MapOfItems); console.log(MapOfItems.keys()); console.log(MapOfItems.values());