Javascript 我的shuffle函数以单数形式工作,但当将多个调用组合到一个函数中时,它会中断
我必须在这里遗漏一些基本原则,但是函数shuffle可以按预期工作,但是当我尝试在另一个函数内多次调用时,第一次调用后的任何调用都会导致一个数组,其中包含52个未定义的条目Javascript 我的shuffle函数以单数形式工作,但当将多个调用组合到一个函数中时,它会中断,javascript,arrays,function,Javascript,Arrays,Function,我必须在这里遗漏一些基本原则,但是函数shuffle可以按预期工作,但是当我尝试在另一个函数内多次调用时,第一次调用后的任何调用都会导致一个数组,其中包含52个未定义的条目 function shuffle(array) { let newDeck = []; for (i=52; i>0; i--) { let randomPick = Math.floor((Math.random() * array.length)); newDec
function shuffle(array) {
let newDeck = [];
for (i=52; i>0; i--) {
let randomPick = Math.floor((Math.random() * array.length));
newDeck.push(array[randomPick]);
deck.splice(randomPick, 1);
}
deck = newDeck;
console.log(deck);
}
function fullShuffle(cards) {
shuffle(cards);
shuffle(cards);
}
问题中的代码不完整,但似乎
deck
是一个全局变量,您还可以将其作为参数传递给fullShuffle
。问题是,deck.splice
在一次调用shuffle
中完全清空该数组,因此如果再次使用该deck
,并再次通过fullShuffle
传递到shuffle
,则传递的是一个空数组,array[randomPick]
将在所有52次迭代中都未定义(如果我对你其余部分的假设正确的话,array
与deck
是相同的参考)
如果要以这种方式实施洗牌,则:
- 不要在该函数中使用全局变量
- 仅依赖函数获取的参数
- 获取该数组的副本,以便您可以愉快地拼接,而不会影响调用者的数组
- 将洗牌数组返回给调用者
还要注意的是,还有更好的
shuffle
实现。看看你在哪里找到了Durstenfeld算法的实现。你在哪里定义了deck
?或者,返回deck…或者,传入要洗牌的deck…你的函数创建了一个deck…很抱歉,这是新的,忘记了重要的代码位。let deck=[“ac”,“2c”,“3c”,“4c”,“5c”,“6c”,“7c”,“8c”,“9c”,“10c”,“jc”,“qc”,“kc”,“ad”,“2d”,“3d”,“4d”,“5d”,“6d”,“6d”,“7d”,“8d”,“9d”,“10d”,“jd”,“qd”,“kd”,“ah”,“2h”,“3h”,“4h”,“8h”,“9h”,“10h”,“qh”,“kh”,“as”,“2s”,“3s”,“4s”,“5s”,“7s”,“8s”,“9s”,“10s”,“js”,“qs”,“ks”,“ks”];如果我只是简单地运行感谢这么多,我对此非常陌生,想创建一个没有框架的简单的东西。我意识到在这样一个函数中需要多次洗牌与人工洗牌相比毫无意义,但我认为在代码中复制这个动作会很有趣。这样做给我自己带来了一个问题,我也记住了d/了解了如何返回结果并将其分配给变量!
function shuffle(array) {
let newDeck = [];
array = [...array]; // take copy!
for (i=52; i>0; i--) {
let randomPick = Math.floor((Math.random() * array.length));
newDeck.push(array[randomPick]);
array.splice(randomPick, 1);
}
console.log(newDeck);
return newDeck; // return it.
}
function fullShuffle(cards) {
cards = shuffle(cards); // capture the returned, shuffled array
cards = shuffle(cards);
return cards; // return to caller
}
// can be called like this:
var deck = [ "ac", "2c", "3c", "4c", "5c", "6c", "7c", "8c", "9c", "10c", "jc", "qc", "kc", "ad", "2d", "3d", "4d", "5d", "6d", "7d", "8d", "9d", "10d", "jd", "qd", "kd", "ah", "2h", "3h", "4h", "5h", "6h", "7h", "8h", "9h", "10h", "jh", "qh", "kh", "as", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "10s", "js", "qs", "ks" ];
deck = fullShuffle(deck);