在javascript中更改数组变量也会更改代码中较早点上的数组值
我正在尝试制作一个纸牌游戏模拟器,但是我的纸牌阵列有问题在javascript中更改数组变量也会更改代码中较早点上的数组值,javascript,arrays,Javascript,Arrays,我正在尝试制作一个纸牌游戏模拟器,但是我的纸牌阵列有问题 let colors = ["heart","diamond","spade","club"]; let numbers = ["ace","2","3","4","5","6","7","8","9","10","jack","queen","king"]; function createDeck(){ let card = {}; let counter = 0; let cards = []; for (let i
let colors = ["heart","diamond","spade","club"];
let numbers = ["ace","2","3","4","5","6","7","8","9","10","jack","queen","king"];
function createDeck(){
let card = {};
let counter = 0;
let cards = [];
for (let i = 0; i<colors.length;i++){
for (let j = 0; j<numbers.length; j++){
card = {
color: colors[i],
number: numbers[j]
}
cards[counter] = card;
counter ++;
}
}
return cards;
}
function shuffle(array){
for(let i = array.length -1; i > 0; i--){
const j = Math.floor(Math.random() * i)
const temp = array[i]
array[i] = array[j]
array[j] = temp
}
}
let deck = createDeck();
console.log(deck);
shuffle(deck);
console.log(deck);
这将首先输出非缓冲数组,然后输出无序数组。
数组是引用(通过引用寻址),因此对其实例所做的一切都将使其发生变异。如果要保留原始的数组
,则应执行对组
副本的无序移动
let colors=[“心形”、“钻石”、“黑桃”、“梅花”];
让数字=[“A”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“杰克”、“女王”、“国王”];
函数createDeck(){
让card={};
设计数器=0;
让卡片=[];
对于(设i=0;i要创建一个数组的副本,而不是仅通过引用另一个数组的第二个变量,请使用array.from();方法
测试此示例并将数组.from();替换为=
const myOrigArray = [...Array(500).keys()].map(x => ++x).sort(() => Math.random() - 0.5);
const myArray = Array.from(myOrigArray);
myArray.splice(Math.floor(Math.random() * myOrigArray.length), 1);
const intersection = myOrigArray.filter(x => !myArray.includes(x));
console.log(intersection);
这只是创建一个包含500个介于1和500之间的随机整数值的数组的一种方法,从数组中随机删除一个元素,然后通过比较/区分原始数组和随机删除值的数组来验证删除了哪个元素。tryconsole.log(JSON.stringify(deck));
那么它就不一样了-当您在控制台中查看数组和对象时,控制台会对它们进行求值…因此,它不是快照本身,除非您将其设置为快照…或者console.log(deck.slice())
-然后您正在记录一个无法更改的数组这将首先输出非缓冲数组,然后输出洗牌数组。
否..在我的情况下,测试数组上的控制台日志会输出两个不同的数组。第一个非缓冲数组和第二个洗牌数组。如果您这样说,证据证明不是这样
const myOrigArray = [...Array(500).keys()].map(x => ++x).sort(() => Math.random() - 0.5);
const myArray = Array.from(myOrigArray);
myArray.splice(Math.floor(Math.random() * myOrigArray.length), 1);
const intersection = myOrigArray.filter(x => !myArray.includes(x));
console.log(intersection);