Estoy haciendo mi primer proyecto de código y tengo algunos problemas con las matrices que cambian sus valores aparentemente por su cuenta.
console.log(permanentDeck) debería devolver 7 cartas, pero parece que se han quitado
He buscado más de una vez alguna línea que cambie el valor de permanentDeck, pero no encontré ninguna
Alguien me puede ayudar a saber en que linea pasa esto??
var playerClass = "Warrior" const examcard1 = {id:1, cost: 1, name:"Slash", text:"Deal 100% damage"} const examcard2 = {id:2, cost: 1, name:"Block", text:"Gain 1 block"} const examcard3 = {id:3, cost: 2, name:"Heavy Strike", text:"Deal 200% damage\nApply 1 vunerable"} const starterWarriorDeck = [examcard1, examcard1, examcard1, examcard2, examcard2, examcard2, examcard3] var deck var permanentDeck = [] switch(playerClass){ case "Warrior": permanentDeck = starterWarriorDeck } var drawPile = [] var hand = [] function shuffle(array){ let currentIndex = array.length, randomIndex; // While there remain elements to shuffle. while (currentIndex != 0) { // Pick a remaining element. randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; // And swap it with the current element. [array[currentIndex], array[randomIndex]] = [ array[randomIndex], array[currentIndex]]; } return array; } function restockDrawPile(){ drawPile = shuffle(deck); } function startBattle(){ deck = permanentDeck; restockDrawPile(); } function startPlayerTurn(){ drawCards(5) } function drawCards(cardsToDraw){ for(i = 0; i < cardsToDraw; i++){ let nextCard = drawPile.pop(); hand.push(nextCard); } } var handView = new PIXI.Container() startBattle(); startPlayerTurn(); console.log(permanentDeck); console.log(deck); console.log(drawPile); console.log(hand); ´´´si agrega console.log(starterWarriorDeck); , encontrará que también se ha modificado. Esto se debe a que las matrices se pasan por referencia, por lo que en las siguientes líneas, no está haciendo una copia de la matriz, solo otra referencia a la misma matriz:
permanentdeck = starterWarriorDeck; deck = permanentdeck; console.log(Object.is(deck, starterWarriorDeck)) // trueDebe copiar explícitamente el contenido en la nueva matriz. Hay varios métodos para hacer una copia superficial en JS, pero los más claros en este caso serían utilizar el operador de propagación... o el método .from. Ejemplos:
permanentDeck = [...starterWarriorDeck] deck = Array.from(permanentDeck)Información relevante: https://www.freecodecamp.org/news/how-to-clone-an-array-in-javascript-1d3183468f6a/
Cuando asigna una matriz (p. ej., cubierta permanente) a una variable (p. ej., cubierta) con deck = permamentDeck , simplemente asigna una referencia a la misma estructura de datos subyacente a la cubierta. Esto significa que deck y mazo permanentDeck apuntarán a la misma entidad y si modifica cualquiera de los dos, modifica lo mismo a lo que hacen referencia ambas variables.
Debe asegurarse de hacer una copia verdadera de la matriz para poder modificar deck sin modificar la plataforma permanentDeck . Uno de los métodos simples para lograr una "copia superficial" de este tipo es usar la slice de división de una matriz javascript.
// make a shallow copy of the array deck = permanentDeck.slice();Eche un vistazo a varios métodos para copiar matrices. https://www.freecodecamp.org/news/how-to-clone-an-array-in-javascript-1d3183468f6a/
También asegúrese de comprender y ser consciente de la diferencia entre una copia superficial y una copia profunda de matrices que consisten en referencias a objetos.