Necesito unirme y pedir 2 arreglos, y no lo he logrado.
la primera matriz contiene "categorías" de pokemons
y la segunda matriz contiene pokemons y algunos datos.
Necesito unir ambas matrices, sumar el valor de poder de cada pokemon y mostrarlos de esta manera
Resultado Esperado
[ {fire: 19000}, { rock: 2100 }, {water: 1500} ]Primera matriz "categorías o tipos"
const pokeTypes = [ { uuid: 1, pokemonType: "fire" }, { uuid: 2, pokemonType: "water" }, { uuid: 3, pokemonType: "rock" } ];2do grupo de pokemons
const pokemons = [ { name: "geodude", pokemonTypeId: 3, power: 900, }, { name: "onix", pokemonTypeId: 3, power: 1200, }, { name: "squirtle", pokemonTypeId: 2, power: 100, }, { name: "seadra", pokemonTypeId: 2, power: 300, }, { name: "goldeen", pokemonTypeId: 2, power: 1100, }, { name: "charmander", pokemonTypeId: 1, power: 2000, }, { name: "charmeleon", pokemonTypeId: 1, power: 4000, }, { name: "charizard", pokemonTypeId: 1, power: 7000, }, { name: "magmar", pokemonTypeId: 1, power: 6000, }, ];Empecé a hacer un reductor y pude generar una matriz de objetos agrupados por pokemonTypeId, no pude continuar después de esto...
Lo intenté
function sortPokemons() { result = pokemons.reduce( (h, pokemons) => Object.assign(h, { [pokemons.pokemonTypeId]: (h[pokemons.pokemonTypeId] || []).concat({ typeId: pokemons.pokemonTypeId, }), }), {} ); console.log(result); } console.log(sortPokemons());¡Gracias!
Puede lograr el resultado de manera fácil y eficiente usando Map
const pokeTypes = [ { uuid: 1, pokemonType: "fire" }, { uuid: 2, pokemonType: "water" }, { uuid: 3, pokemonType: "rock" }, ]; const pokemons = [ { name: "geodude", pokemonTypeId: 3, power: 900, }, { name: "onix", pokemonTypeId: 3, power: 1200, }, { name: "squirtle", pokemonTypeId: 2, power: 100, }, { name: "seadra", pokemonTypeId: 2, power: 300, }, { name: "goldeen", pokemonTypeId: 2, power: 1100, }, { name: "charmander", pokemonTypeId: 1, power: 2000, }, { name: "charmeleon", pokemonTypeId: 1, power: 4000, }, { name: "charizard", pokemonTypeId: 1, power: 7000, }, { name: "magmar", pokemonTypeId: 1, power: 6000, }, ]; const map = new Map(); pokemons.forEach((o) => map.has(o.pokemonTypeId) ? map.set(o.pokemonTypeId, map.get(o.pokemonTypeId) + o.power) : map.set(o.pokemonTypeId, o.power) ); const result = pokeTypes.map((o) => ({ [o.pokemonType]: map.get(o.uuid) })); console.log(result); /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }Se puede lograr usando una programación inmutable simple: solo use los métodos de matriz map() y reduce() .
const pokeTypes = [ { uuid: 1, pokemonType: "fire" }, { uuid: 2, pokemonType: "water" }, { uuid: 3, pokemonType: "rock" }, ]; const pokemons = [ { name: "geodude", pokemonTypeId: 3, power: 900, }, { name: "onix", pokemonTypeId: 3, power: 1200, }, { name: "squirtle", pokemonTypeId: 2, power: 100, }, { name: "seadra", pokemonTypeId: 2, power: 300, }, { name: "goldeen", pokemonTypeId: 2, power: 1100, }, { name: "charmander", pokemonTypeId: 1, power: 2000, }, { name: "charmeleon", pokemonTypeId: 1, power: 4000, }, { name: "charizard", pokemonTypeId: 1, power: 7000, }, { name: "magmar", pokemonTypeId: 1, power: 6000, }, ]; const totals = pokeTypes.map(({uuid, pokemonType}) => { const total = pokemons.reduce((acc, {power, pokemonTypeId}) => pokemonTypeId === uuid ? acc + power : acc , 0); return { [pokemonType] : total }; }); console.log(totals); Y si desea un objeto limpio agradable { fire: 19000, rock: 2100, water: 1500 } , que en mi opinión es más limpio que una matriz, reemplace el .map() con otro .reduce() :
const totals = pokeTypes.reduce((acc, {uuid, pokemonType}) => { const total = pokemons.reduce((totalAcc, {power, pokemonTypeId})=> pokemonTypeId === uuid ? totalAcc + power : totalAcc , 0); return { ...acc, [pokemonType]: total, } }, {}); const pokeTypes = [ { uuid: 1, pokemonType: "fire" }, { uuid: 2, pokemonType: "water" }, { uuid: 3, pokemonType: "rock" } ]; const pokemons = [ { name: "geodude", pokemonTypeId: 3, power: 900, }, { name: "onix", pokemonTypeId: 3, power: 1200, }, { name: "squirtle", pokemonTypeId: 2, power: 100, }, { name: "seadra", pokemonTypeId: 2, power: 300, }, { name: "goldeen", pokemonTypeId: 2, power: 1100, }, { name: "charmander", pokemonTypeId: 1, power: 2000, }, { name: "charmeleon", pokemonTypeId: 1, power: 4000, }, { name: "charizard", pokemonTypeId: 1, power: 7000, }, { name: "magmar", pokemonTypeId: 1, power: 6000, }, ]; var data = pokeTypes.map(function(type) { var res = {}; res[type.pokemonType] = pokemons.filter((item) => { return item.pokemonTypeId === type.uuid; }).reduce(function(sum, item) { return sum + item.power; }, 0); return res; }); console.log(data);