Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.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 我的shuffle函数以单数形式工作,但当将多个调用组合到一个函数中时,它会中断_Javascript_Arrays_Function - Fatal编程技术网

Javascript 我的shuffle函数以单数形式工作,但当将多个调用组合到一个函数中时,它会中断

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

我必须在这里遗漏一些基本原则,但是函数shuffle可以按预期工作,但是当我尝试在另一个函数内多次调用时,第一次调用后的任何调用都会导致一个数组,其中包含52个未定义的条目

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);