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

148
Vistas
Cómo insertar claves de objeto en una matriz varias veces en función de sus valores enteros en JavaScript

He buscado en varios sitios, incluso a través de las respuestas sugeridas al publicar esta pregunta, así que discúlpeme si se ha respondido en otro lugar. Soy muy nuevo en JavaScript (y en la codificación en general). Estoy trabajando en un proyecto de 'lotería ponderada' y tengo un enfoque en mente que estoy seguro funcionará, pero estoy atascado en un punto en particular.

Tengo un objeto que contiene los resultados como claves de objeto y la cantidad de veces que ese resultado en particular se producirá como valores de objeto de tipo entero. En concreto, esto:

 const weights = { 'win': 5, 'loss': 10, 'tie': 3 }

Quiero enviar las claves de objeto a una matriz llamada 'resultados' varias veces en función de su valor asociado. Para el ejemplo anterior, daría como resultado una matriz que enumera 'ganar' 5 veces, 'perder' 10 veces y 'empatar' 3 veces.

Me encontré con el método .fill, pero no parece funcionar en una situación como esta, en la que quiero que la cantidad de elementos del objeto sea dinámica (tanto en la cantidad de ellos como en sus valores, es decir, tener 15 'diferentes' resultados' cada uno con diferentes valores asignados a ellos).

¿Algún consejo? ¡Gracias a todos por este maravilloso recurso!

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

0

fill podría usarse para esto, pero creo que solo usaría bucles:

 const outcomes = []; for (const [key, count] of Object.entries(weights)) { for (let n = count; n > 0; --n) { outcomes.push(key); } }

Ejemplo en vivo:

 const weights = { "win": 5, "loss": 10, "tie": 3 }; const outcomes = []; for (const [key, count] of Object.entries(weights)) { for (let n = count; n > 0; --n) { outcomes.push(key); } } console.log(outcomes);

Pero así es como podrías usar el fill junto con la extensión si quisieras:

 const outcomes = []; for (const [key, count] of Object.entries(weights)) { outcomes.push(...Array.from({length: count}).fill(key)); }

Ejemplo en vivo:

 const weights = { "win": 5, "loss": 10, "tie": 3 }; const outcomes = []; for (const [key, count] of Object.entries(weights)) { outcomes.push(...Array.from({length: count}).fill(key)); } console.log(outcomes);

La respuesta de David apunta a una mejor manera de hacer el fill que esa (¡me había olvidado de start y end , doh!), Pero lo haría de manera ligeramente diferente:

 const outcomes = []; for (const [key, count] of Object.entries(weights)) { const start = outcomes.length; outcomes.length += count; outcomes.fill(key, start, outcomes.length); }

Ejemplo en vivo:

 const weights = { "win": 5, "loss": 10, "tie": 3 }; const outcomes = []; for (const [key, count] of Object.entries(weights)) { const start = outcomes.length; outcomes.length += count; outcomes.fill(key, start, outcomes.length); } console.log(outcomes);

Dicho esto, la ventaja de la respuesta de David es que le dice al motor de JavaScript por adelantado cuántos elementos tendrá la matriz, que se pueden usar para la optimización. A menudo no importa, y probablemente no importa aquí, pero aun así, está ahí.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puedes hacerlo con relleno. Puede crear una nueva matriz con los pesos combinados como parámetro de longitud y luego llenarla así.

 const weights = { 'win': 5, 'loss': 10, 'tie': 3 }; let outcomes = new Array(Object.values(weights).reduce((value, initial) => value+initial)); let pos = 0; for(let [key, value] of Object.entries(weights)) { outcomes.fill(key, pos, pos += value); } console.log(outcomes);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Tal vez esto sea útil:

 const weights = { win: 5, loss: 10, tie: 3 } const result = [] Object.keys(weights).forEach(name => { const times = weights[name] result.push(...new Array(times).fill(name)) }) console.log(res)
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