Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中更改数组变量也会更改代码中较早点上的数组值_Javascript_Arrays - Fatal编程技术网

在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之间的随机整数值的数组的一种方法,从数组中随机删除一个元素,然后通过比较/区分原始数组和随机删除值的数组来验证删除了哪个元素。

try
console.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);