Necesito separar los datos de una matriz según la identificación del jugador. La base de datos que tengo se ve así:
var database =[ { player: 1, level: 1, score: 20 }, { player: 2, level: 1, score: 25 }, { player: 3, level: 1, score: 7 }, { player: 1, level: 2, score: 25 }, { player: 2, level: 2, score: 7 } ]Poco a poco se irán añadiendo nuevos objetos que contengan nuevos jugadores y desaparecerán los antiguos, ya que la base de datos está limitada a 40 entradas. Esto significa que la base de datos cambia dinámicamente.
Mi objetivo es empujar los objetos a nuevas matrices según la identificación del jugador. Así que el resultado tiene que verse así:
var player1 = [ { player: 1, level: 1, score: 20 }, { player: 1, level: 2, score: 25 } ] var player2 = [ { player: 2, level: 1, score: 25 }, { player: 2, level: 2, score: 7 } ] var player3 = [ { player: 3, level: 1, score: 7 } ]Primero, puede convertir la matriz en un objeto para mejorar el acceso y luego puede asignar propiedades de objeto a las variables:
const database = [ { player: 1, level: 1, score: 20 }, { player: 2, level: 1, score: 25 }, { player: 3, level: 1, score: 7 }, { player: 1, level: 2, score: 25 }, { player: 2, level: 2, score: 7 } ]; const { player1, player2, player3 } = database.reduce((acc, el) => { if (!('player' + el.player in acc)) acc['player' + el.player] = [el]; else acc['player' + el.player].push(el); return acc }, {}); console.log(player1, player2, player3);Aunque es posible crear variables globales con nombres dinámicos, no es posible crear variables no globales con nombres dinámicos, y el entorno global ya está lo suficientemente lleno como para crear un montón de nuevas globales no es la mejor práctica.
En su lugar, utilice un Map :
const playerArrays = new Map(); for (const entry of database) { const key = `player${entry.player}`; const array = playerArrays.get(key); if (!array ) { // Haven't seen this one yet, add a new array playerArrays.set(key, [entry]); } else { // We have the array, add to it array.push(entry); } } Luego obtienes una matriz individual usando playerArrays.get("player1") y tal.
Ejemplo en vivo:
var database = [{ player: 1, level: 1, score: 20 }, { player: 2, level: 1, score: 25 }, { player: 3, level: 1, score: 7 }, { player: 1, level: 2, score: 25 }, { player: 2, level: 2, score: 7 } ]; const playerArrays = new Map(); for (const entry of database) { const key = `player${entry.player}`; const array = playerArrays.get(key); if (!array ) { // Haven't seen this one yet, add a new array playerArrays.set(key, [entry]); } else { // We have the array, add to it array.push(entry); } } console.log("player1:", playerArrays.get("player1")); .as-console-wrapper { max-height: 100% !important; }