我有一系列像这样的名片:
var deckNames = [ "unused",
"sA", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "sJ", "sQ", "sK",
"hA", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "h10", "hJ", "hQ", "hK",
"cA", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "cJ", "cQ", "cK",
"dA", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "dJ", "dQ", "dK",
];
我想编写一个从数组中随机选择一张卡的函数,并将其从上面的“deckNames”数组中删除。我写了以下内容,但它似乎没有起作用。
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
return deckNames[card];
deckNames.splice(card,1);
};
当我在控制台中运行deal
函数时,它会从数组中随机选择并返回一张卡片,但deckNames
数组本身并不会从阵列中删除已发出的卡片。我怎样才能做到这一点?谢谢。
答案 0 :(得分:3)
它没有拼接,因为splice
调用是死代码;这意味着它永远无法运行。
return
后,您“退出”该功能。你需要在返回前拼接:
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
deckNames.splice(card,1);
return deckNames[card];
};
考虑:
var test = function(){
console.log("Hello");
return;
console.log("World");
};
test();
你认为这些印刷品是什么?
编辑:
再次重读你的代码,我意识到如果你处理足够的卡片,仍然会出现一个重大问题。您已将52
硬编码到您的功能中,但每次通话时都会移除一张卡。如果只有10张卡会发生什么,但随机数生成器会给你50
?将52
更改为deckNames.length
以确保您不会尝试处理不存在的卡(这会导致“数组越界”错误)。
答案 1 :(得分:3)
您的return
语句在修改卡组之前结束您的功能。切换语句,以便return
是函数中的最后一个。另外,正如@DavidE指出的那样,你已经删除它后无法从阵列中获取该卡,所以你必须在删除它之前检索它:
var deal = function(){
var index = Math.floor(Math.random() * 52) + 1;
var card = deckNames[index];
deckNames.splice(index, 1);
return card;
};
或者简单地说:
var deal = function(){
var card = Math.floor(Math.random() * 52) + 1;
return deckNames.splice(card, 1)[0];
};
(因为splice
返回被删除的元素,包装在一个新数组中)。
还需要考虑其他一些事项:
数组索引从0开始,因此您可能不希望随机数生成器中的+1
。你实际上想要0到51 *之间的数字:
var card = Math.floor(Math.random() * 52);
每次发牌都会减少牌组的大小。而不是每次生成最多51个随机数,而是在调用函数时将该数字基于卡座的大小。否则你会得到索引超出范围的错误。见下文。
最终,这会给你这样的东西:
var deal = function(){
var card = Math.floor(Math.random() * deckNames.length);
return deckNames.splice(card, 1)[0];
};
答案 2 :(得分:0)
首先,你可以摆脱你的string
,然后检查出来:
"unused"
现在了解这一点:
function deal(deck){
var card = Math.floor(Math.random()*deck.length); // notice you add the one later - that's not right
return deck.splice(card, 1);
}
var pulledCard = deal(deckNames); // now deckNames array is altered