Estoy tratando de implementar una baraja de cartas barajadas en Javascript, pero me encuentro con un comportamiento que me cuesta entender.
Aquí está mi código. Para ser conciso, este mazo contiene solo cartas con caras 1-5 y solo dos palos:
function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } } function getDeck() { let values = Array(5).fill().map((element, index) => index + 1); let suits = ['H', 'D']; let deck = new Array(); values.forEach(function(value) { suits.forEach(function(suit) { let card = { 'value': value, 'suit': suit } deck.push(card); }) }) return deck } var deck = getDeck(); console.log(deck); shuffleArray(deck); console.log(deck);Tomé el código aleatorio en el lugar de esta respuesta
Esperaría que la primera declaración de registro muestre un mazo sin barajar y que la segunda declaración de registro muestre un mazo barajado. ¡En cambio, ambos muestran mazos barajados de manera idéntica! ¡Es como si la aleatorización retrocediera en el tiempo!
Para empeorar las cosas, cuando intenté codificar un ejemplo mínimo por primera vez, no me molesté con los valores y los palos y solo traté de barajar una pequeña matriz, pero en ese caso, funcionó exactamente como se esperaba, solo profundizando mi confusión. ..
function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } } function getDeck() { let deck = [1, 2, 3, 4, 5]; return deck; } var deck = getDeck(); console.log(deck); shuffleArray(deck); console.log(deck);En ese caso, la salida es
¿Que esta pasando? ¿Por qué el caso simple funciona pero el caso más complejo parece no hacerlo? ¿Qué pasa con el tiempo o el alcance que estoy malinterpretando?
Está modificando directamente en la matriz principal (la plataforma original) y console.log no es síncrono, por eso ambos son iguales. Le sugiero que clone otra matriz y modifique esa nueva matriz en su lugar
const newArray = [...array] //clone the original array to the new array function shuffleArray(array) { const newArray = [...array] for (var i = newArray.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = newArray[i]; newArray[i] = newArray[j]; newArray[j] = temp; } return newArray } function getDeck() { let values = Array(5).fill().map((element, index) => index + 1); let suits = ['H', 'D']; let deck = new Array(); values.forEach(function(value) { suits.forEach(function(suit) { let card = { 'value': value, 'suit': suit } deck.push(card); }) }) return deck } var deck = getDeck(); console.log(deck); const newDeck = shuffleArray(deck); console.log(newDeck); .as-console-wrapper { max-height: 100% !important; top: 0; }