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

157
Vistas
¿Cómo usar solo dos veces el mismo elemento en una matriz en js?

Actualmente estoy trabajando en un juego de pares en JavaScript pero no sé cómo usar la imagen solo dos veces no más.

Hice una matriz de objetos con las imágenes que tienen como clave ID, src y un nombre. Recorro esta matriz para tener la identificación y usarla en la plantilla de forma aleatoria. Así que no tengo la misma imagen una al lado de la otra.

Este es el estado actual de mi código:

 for (let index = 0 ; index < 18; index++) { let x = Math.round(Math.random() * 8); let template = document.getElementsByTagName('template')[0]; let target = document.getElementById('Playground'); let clone = template.content.cloneNode(true); clone.querySelector("img").src= item[x].src; clone.querySelector("img").alt = item[x].id; clone.querySelector('button').setAttribute('id', i++); clone.querySelector('button').setAttribute('Onclick', null); target.appendChild(clone); };

Creo que el problema es la variable x que genera aleatoriamente una imagen en la plantilla. Pero la misma imagen regresa más o menos de 2 veces o algunas imágenes no se utilizan.

Puede alguien ayudarme por favor ?

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

0

De su código publicado, creo que todos los elementos únicos están en una matriz llamada items . Para asegurarse de tener 2 copias de cada uno, puede crear una nueva matriz que incluya items dos veces:

 const doubleItems = items.concat(items);

Para obtener un elemento aleatorio de una matriz, puede escribir:

 const randomIndex = Math.floor(Math.random() * doubleItems.length); const randomElement = doubleItems[randomIndex];

(Observe el .floor , no .round !)

Para asegurarse de no seguir obteniendo accidentalmente el mismo elemento aleatorio varias veces, puede eliminar todos los elementos que elija de su fuente:

 doubleItems.splice(randomIndex, 1);

Si hace esto en un ciclo while , ¡puede continuar hasta que se coloquen todos los elementos!

 const items = [ { src: "A" }, { src: "B" }, { src: "C" }, { src: "D" }, { src: "E" }, { src: "F" }, { src: "G" }, { src: "H" } ]; const doubleItems = items.concat(items); while (doubleItems.length) { // Pick random element const randomIndex = Math.floor(Math.random() * doubleItems.length); const randomElement = doubleItems[randomIndex]; // Remove element doubleItems.splice(randomIndex, 1); // Simplified for brevity const tile = document.createElement("div"); tile.innerText = randomElement.src; document.body.appendChild(tile); }
 body { display: grid; grid-template-columns: 30px 30px 30px 30px; grid-template-rows: 30px 30px 30px 30px; grid-gap: 4px; } div { border: 1px solid black; display: flex; align-items: center; justify-content: center; }

about 4 years ago · Juan Pablo Isaza Denunciar

0

La mejor manera de pensar en ello si tiene un número finito de elementos es crear la matriz que necesita para su solución final (Opción A) o encontrar una manera de excluir elementos de la selección aleatoria después de que no los quiera. más (Opción B).

Primero, refactorizaré la copia de su plantilla en una función llamada render, y sus iteraciones totales (18) y maxIndex (8) en constantes:

 const render = (currItem, index) => { let template = document.getElementsByTagName('template')[0]; let target = document.getElementById('Playground'); let clone = template.content.cloneNode(true); clone.querySelector("img").src= currItem.src; clone.querySelector("img").alt = currItem.id; clone.querySelector('button').setAttribute('id', index); clone.querySelector('button').setAttribute('onClick', null); target.appendChild(clone); }; // The following variables will make your code dynamic, so if you add more items to the game it will continue working correctly const total = item.length * 2; const maxIndex = item.length - 1;

Opción A

Esta opción tiene fines educativos y, dado que tiene una lista finita, puede estar bien, pero es menos eficaz.

 const items = [...item, ...item]; // this is creating a new array with all items twice // shuffle the items in the array for (let i = items.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [items[i], items[j]] = [items[j], items[i]]; } // The array is shuffled with 2 instances of each item, so this will show the desired values items.forEach(render)

Opción B

En esta opción, crearemos una segunda matriz que excluya los elementos que se usaron dos veces.

 const rendered = [] // will store items rendered once while(item.length > 0) { // will run until item has no element let index = Math.round(Math.random() * (item.length - 1)); // max index is based on the current length of item array const currItem = item[index]; render(currItem, index); if (rendered.includes(currItem)) { item.splice(index, 1); // remove item after the second time it is rendered } else { rendered.push(currItem); // add to the rendered array after the first pass } }
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