javascript - 在 javascript 中更改数组变量也会更改代码中早期点的数组值
问题描述
我正在尝试制作纸牌游戏模拟器,但我的甲板阵列有问题。
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);
这首先输出未打乱的数组,然后是打乱的数组。
解决方案
Arrays
是引用(由引用寻址,另见),所以你对它的实例所做的一切都会改变它。如果要保留deck
原始.Array
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; }
推荐阅读
- swift - 如何从确定的路径中删除 usr/local/include 中的所有符号链接
- node.js - 如何修复 MongoClient 不是构造函数错误
- reactjs - React Context Hook vs 将数据直接引入组件
- ruby-on-rails - 在我的 GSuite 日历上创建活动并使用服务帐户邀请与会者
- graphql - 小型项目的阿波罗联盟
- python-3.x - Python3.6,在递归回溯期间尝试附加到属性列表,但它会丢弃结果?
- c# - ASP.NET CORE Web 应用程序抛出 SQLiteException:无法打开数据库文件
- mongodb - 带有条件的Mongodb动态$sum
- c - Golang 使用 cgo 从共享 c 库调用函数
- r - 使用其他两个数据框之间的映射制作数据框