这里有一个数组未定义的数组。我试图打印这个数组的随机元素并剪切它。这是我的代码。
function rand(min, max){
return (Math.floor(Math.random() * (max - min + 1)) + min).toFixed(0);
}
$('#do').click(function(){
var count = chamarr.length;
var num = 0;
if (count == 1) {
$('#output').html('Nothing can found');
} else {
num = rand(1,chamarr.length);
$('#output').html(chamarr[num]);
chamarr.splice(num,1);
}
});
当我记录一个数组被切割时,我看到它总是好的,但有时元素不会被切断!
答案 0 :(得分:7)
我的猜测问题出在您的randnum
方法上:
function rand(min, max){
return (Math.floor(Math.random() * (max - min + 1)) + min).toFixed(0);
}
我相信这将为您提供[min, max]
范围内的值 - 包括两端。 (嗯,实际上,它将为您提供该值的字符串版本,因为toFixed
返回一个字符串,但是当您稍后使用它时,它将被强制转换回一个数字。)
现在你这样称呼它:
num = rand(1,chamarr.length);
因此,如果数组长度为6个元素,则会得到[1, 6]
范围内的值。但是,您将尝试使用chamarr[num]
- 并且有效索引的范围是[0, 5]
,因为数组是基于0的。如果您尝试使用元素6,那将为您提供undefined
- 但在元素6处拼接将无法执行任何操作。
我会将您的rand
方法更改为独占,如下所示:
function rand(min, max) {
return (Math.floor(Math.random() * (max - min)) + min).toFixed(0);
}
然后像这样调用它:
num = rand(0, chamarr.length);
这将为您提供索引和拼接的正确范围内的值。
编辑:回应评论等:
可能值得删除toFixed(0)
函数的rand
部分;毕竟,你 想要一个字符串。这不是以前错误的一部分,但它通常更清洁:
function rand(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
您可能还需要一个使0
下限隐含的函数版本
Math.floor()
/ Math.random()
个来电,而不是单独使用我想让他们远离那些只想获得随机数并使用它的“逻辑”代码。for
循环,包含下限和独占下限等。答案 1 :(得分:2)
问题是num
是超出范围的索引。你应该这样做:
num = rand(0, chamarr.length - 1);
答案 2 :(得分:0)
您可以简化逻辑:
function rand(max) {
return Math.round( Math.random() * max ) % max;
}
var arr = [1, 2, 3, 4],
len = arr.length,
num = rand(len);
if ( len === 1 ) {
// Do your "Nothing here" output
}
else {
arr.splice(num, 1);
// etc, etc, etc...
}