Javascript 无法使用array.splice()洗牌组数组

Javascript 无法使用array.splice()洗牌组数组,javascript,arrays,Javascript,Arrays,我正在尝试使用array.splice()将Card对象的一组数组随机洗牌为newDeck对象的一组Card数组。我想我的问题要么与变量作用域有关,要么与对array.splice()的误解有关 var-deck=[new-Card()、new-Card()、new-Card()、new-Card()、new-Card()]; var newDeck=[]; var shuffle=函数(){ var i=“”; 对于(i=0;i

我正在尝试使用
array.splice()
Card
对象的一组数组随机洗牌为
newDeck
对象的一组
Card
数组。我想我的问题要么与变量作用域有关,要么与对
array.splice()
的误解有关

var-deck=[new-Card()、new-Card()、new-Card()、new-Card()、new-Card()];
var newDeck=[];
var shuffle=函数(){
var i=“”;
对于(i=0;i

有更好的洗牌方法吗?

将你的
倒转为
循环:

for (i = deck.length - 1; i >= 0; i--)
    newDeck.push(deck.splice(Math.floor(Math.random() * deck.length))[0]);
您遇到的问题是,
deck.length
每次循环执行时都会减少
deck.splice
。或者,您可以在运行脚本之前将
deck.length
保存在单独的变量中:

var length = deck.length;
for (i = 0; i < length; i++){      
    newDeck[i] = deck.splice(Math.floor(Math.random() * deck.length))[0];
var length=deck.length;
对于(i=0;i
但是,在循环内部,必须使用
deck.length

注意:
Math.floor
只需要一个参数。那是什么,“1”应该是什么?初始化
i=”“
是没有意义的,因为该值未使用。只需将
var i;
放入即可


Edit:修复了关于
数组返回值的一个缺失点。splice

如果您不想在这种情况下重新发明轮子,您还可以使用
数组#shuffle
方法;)

是的,对
数组有误解。splice()
。阅读:它将返回一个已删除元素的数组,在您使用一张卡的情况下:
[]
。另外,使用
deck.splice(Math.floor(Math.random()*deck.length,1))
1
(我猜应该是要删除多少张卡)是
Math.floor
的参数,而不是
splice
-您将删除索引后的所有元素。因此,您似乎需要:

var deck = [new Card(), new Card(), new Card(), new Card(), new Card(), new Card()];
var newDeck = [];
var shuffle = function(){
    var i = "";
    for (i = 0; i < deck.length; i++){      
        newDeck[i] = deck.splice(Math.floor(Math.random() * deck.length, 1));
}    
};

shuffle();
function shuffle(deck) {
    var newDeck = [];
    for (var i = 0; i < deck.length; i++)    
        newDeck[i] = deck.splice(Math.floor(Math.random() * deck.length), 1)[0];
    return newDeck;
}    
shuffle([new Card(), new Card(), new Card(), new Card(), new Card(), new Card()]);
或者,算法来自:

函数洗牌(组){
var newDeck=[];
对于(var i=0;i
谢谢,MaxArt.“1”应该是splice函数的一个参数,我的错误。将deck、length放入一个单独变量的好技巧。下面的Bergi指出array.splice返回一个包含所选元素的数组,而不是一个简单的值……谢谢,Bergi!我想知道array.splice会返回什么。现在似乎可以了,但我可能会尝试使用这些参数她的方式也是如此。
deck.sort(function(a, b){ return 0.5-Math.random(); })
function shuffle(deck) {
    var newDeck = [];
    for (var i = 0; i < deck.length; i++) {    
        var rand = Math.floor(Math.random() * (i + 1));  
        newDeck[i] = newDeck[rand];
        newDeck[rand] = deck[i];
    }
    return newDeck;
}