Estoy aprendiendo a filtrar arreglos anidados en javascript y creo que este ejemplo me puede ayudar a entenderlo mejor. debajo está el objeto.
const game = () => { return { player1: { username: 'ABC', playingAs: 'X' }, player2: { username: 'XYZ', playingAs: '0' }, board: [ ['✓', null, 'X'], ['X', '✓', null], ['✓', null, 'X'] ] } };mi código está abajo
const {player1: {username: PlayerA, playingAs:PlayerAMark}, player2: {username: PlayerB, playingAs:PlayerBMark}} = game(); const {board: board} = game(); //is there any efficient way to do it without a loop using a filter? for (const item in board) { //One approach which comes to my mind is to loop. but that is what I don't think would be a learning curve for me. }estoy intentando algo como esto
const array = board; for (const item in board) { console.log(array.filter(innerArray => innerArray[item] !== 'X')); }Estoy enfocado en implementar alguna forma eficiente que pueda ayudarme a regresar
Player1 marked 'X' at 3,1,3 and Player 2 marked '0' at location at 0,2,1Solo estoy atascado con el filtrado de esta matriz multidimensional de la placa.
Aprecio tu ayuda en esto.
También puede utilizar la función reduce . Podemos tener la salida deseada usando este código:
function printForPlayer(player, board) { var indexes = board.reduce((acc,row)=>[...row.reduce((acc2,item,index) => item==player.playingAs ? [...acc2,index+1] : acc2, []),...acc], []) console.log(`${player.username} marked ${player.playingAs} at ${indexes.join(',')}`) } printForPlayer(game().player1, game().board); printForPlayer(game().player2, game().board);esto es un poco complejo, pero funciona sin bucle
Una forma es recorrer cada fila para crear una matriz con todos los lugares donde el jugador tiene su propio símbolo.
Usando reduce() , podemos encontrar todos los índices del symobl del reproductor actual, luego, después del bucle, use join() para mostrarlo.
const data = {player1: {username: 'ABC', playingAs: 'X'}, player2: {username: 'XYZ', playingAs: '0'}, board: [['0', null, 'X'], ['X', '0', null], ['0', null, 'X'] ] }; const logPlayer = (player) => { const ox = data[player].playingAs; let indexes = []; for (let row in data.board) { const ii = data.board[row].reduce((prev, cur, i) => (cur === ox) ? [ ...prev, i ] : prev,[]); if (ii.length > 0) ii.map(i => indexes.push(`${+row + 1}-${i + 1}`)); } console.log(`${player} has placed an '${ox}' on the following places (row-column)`, indexes.join(", ")); } logPlayer('player1'); logPlayer('player2'); player1 has placed an 'X' on the following places (row-column) 1-3, 2-1, 3-3 player2 has placed an '0' on the following places (row-column) 1-1, 2-2, 3-1Así que aquí está mi solución que funcionó para mí.
En primer lugar, null siempre se representa como 0. Así que tuve que actualizar mi matriz como se menciona a continuación.
board: [ ['✓', null, 'X'], ['X', '✓', null], ['✓', null, 'X'] ]En segundo lugar, después de actualizar el valor del tablero en la matriz, la siguiente solución me funcionó.
const { player1: {username: PlayerA, playingAs:PlayerAMark}, player2: {username: PlayerB, playingAs:PlayerBMark}, board: GameBoard } = game(); let array = GameBoard.entries(); let tick = []; let cross = []; for (const [index,element] of array) { tick.push(element.indexOf(PlayerBMark)+ 1); cross.push(element.indexOf(PlayerAMark)+ 1); } console.log('Player ', PlayerA, ' Clicked ', PlayerAMark ,' at '+ cross); console.log('Player ',PlayerB, ' Clicked ', PlayerBMark ,' at '+ tick);Aquí está el resultado de esto.
Player ABC Clicked X at 3,1,3 Player XYZ Clicked ✓ at 1,2,1Gracias a todos por toda la ayuda. Pero, todavía estoy buscando ¿Cómo podemos mejorar su rendimiento y evitar bucles?
Gracias de nuevo.