Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

414
Vistas
Tick Tack Toe: filtro de matriz multidimensional en JavaScript

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,1

Solo estoy atascado con el filtrado de esta matriz multidimensional de la placa.

Aprecio tu ayuda en esto.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

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

about 4 years ago · Juan Pablo Isaza Denunciar

0

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-1
about 4 years ago · Juan Pablo Isaza Denunciar

0

Así 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,1

Gracias a todos por toda la ayuda. Pero, todavía estoy buscando ¿Cómo podemos mejorar su rendimiento y evitar bucles?

Gracias de nuevo.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda