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