javascript - 在 javascript 中更改数组变量也会更改代码中较早点的数组值

标签 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 = 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 test = [1,2,3]
console.log(test);
shuffle(test);
console.log(test);

这首先输出未打乱的数组,然后是打乱的数组。

最佳答案

数组 是引用(通过引用寻址,see also),所以你对它的一个实例所做的一切都会改变它。如果您想保留原始数组,您应该对deck副本 进行随机播放。

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
  }
  return array;
  // ^ the copy should be returned
}

let deck = createDeck();
console.log(deck.slice(0, 3));
const shuffled = shuffle(deck.slice(0));
//                       ^ this creates a copy of deck
console.log(shuffled.slice(0, 3));
.as-console-wrapper { top: 0; max-height: 100% !important; }

关于javascript - 在 javascript 中更改数组变量也会更改代码中较早点的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58669514/

相关文章:

php - 如何对一组罗马数字进行排序?

javascript - 启动 Angular Controller 的更好方法

JavaScript 传播语法与 jQuery $.extend - ByRef 和 ByVal

javascript - 使用 multer 上传文件不能完全工作 (NodeJS)

javascript - 帮助我理解 javascript(jquery) 术语中的滚动

javascript - 如何有条件地禁用 jQuery Accordion

c - 布林带段错误

JavaScript .map 返回

c# - 将数据表转换为 double 组

python - numpy 中 1d 到 3d 索引对应的有效算法