Tengo dos matrices que se toman en diferentes períodos de tiempo. ¿Cómo verificar qué jugador ha subido/bajado en la lista con la inclusión de marcar un nuevo jugador también como subiendo?
PD: las matrices ya están ordenadas según la puntuación.
pastData:[ { playerName:'John Doe', score:50 }, { playerName:'Jane Doe', score:40 }, { playerName:'John Appleseed', score:30 }, { playerName:'John Walker', score:20 }, ] presentData:[ { playerName:'Jane Doe', score:80 }, { playerName:'John Doe', score:60 }, { playerName:'John Appleseed', score:40 }, { playerName:'John Mayer', score:30 }, ]
Necesito verificar los cambios de índice comparando las dos matrices y obtener un resultado como el siguiente.
presentData:[ { playerName:'Jane Doe', score:80, position:'up' }, { playerName:'John Doe', score:60, position:'down' }, { playerName:'John Appleseed', score:40, position:'same' }, { playerName:'John Mayer', score:30, position:'up' }, ]
Estoy intentando lo siguiente, pero parece que no puedo encontrar una solución para el caso de uso del nuevo jugador.
let status=[] //this array will include the changes which I can use later to update the presentData array with a "position:'up/down/same'" key-value pairs. for (let i = 0; i < 4; i++) { for(let j=0; j<4; j++) { if(Object.values(pastData)[i].id==Object.values(presentData)[j].id){ if(i==j){ status.push('same') } if(i<j){ status.push('down') } if(i>j){ status.push('up') } } } }
Cree un mapa a partir de la matriz pastData
que asigna el nombre del playerName
a su index
.
Iterar sobre la matriz presentData
y usar el mapa para calcular la posición de cada jugador.
const pastData = [ { playerName: "John Doe", score: 50 }, { playerName: "Jane Doe", score: 40 }, { playerName: "John Appleseed", score: 30 }, { playerName: "John Walker", score: 20 }, ]; const presentData = [ { playerName: "Jane Doe", score: 80 }, { playerName: "John Doe", score: 60 }, { playerName: "John Appleseed", score: 40 }, { playerName: "John Mayer", score: 30 }, ]; const pastDataMap = new Map(pastData.map((d, i) => [d.playerName, i])); const status = presentData.map((d, i) => { const pastIndex = pastDataMap.get(d.playerName); return { ...d, position: pastIndex === undefined || i < pastIndex ? "up" : i > pastIndex ? "down" : "same", }; }); console.log(status);
Otra documentación relevante:
Puede crear un pastDataScoreHash
con Array.prototype.reduce() y crear una matriz de result
con Array.prototype.map() agregando la propiedad de position
a cada jugador y obteniendo su valor comparando el score
pasado de pastDataScoreHash
con el score
actual
Código:
const pastData = [ { playerName: 'John Doe', score: 50 }, { playerName: 'Jane Doe', score: 40 }, { playerName: 'John Appleseed', score: 30 }, { playerName: 'John Walker', score: 20 }, ] const presentData = [ { playerName: 'Jane Doe', score: 80 }, { playerName: 'John Doe', score: 60 }, { playerName: 'John Appleseed', score: 40 }, { playerName: 'John Mayer', score: 30 }, ] const pastDataHash = pastData.reduce((a, { playerName: p }, i) => ((a[p] = i), a), {}) const getPosition = (past, current) => { switch (true) { case past == current: return 'same' case past == undefined || past > current: return 'up' default: return 'down' } } const result = presentData.map((p, i) => ({ ...p, position: getPosition(pastDataHash[p.playerName], i), })) console.log(result)
https://stackoverflow.com/questions/72401269/compare-two-arrays-of-player-scores-to-see-who-has-gone-up-down-in-the-list#
Esta es una solución aproximadamente x4 más rápida que la primera.
presentData.map((present,index)=> { const pastIndexPostion = pastData.findIndex(t => t.playerName === present.playerName) if(pastIndexPostion > index || pastIndexPostion===-1){ present.position = 'up' }else if(pastIndexPostion === index){ present.position = 'same' }else { present.position = 'down' } return present })