Splice只在部分时间工作

时间:2012-07-07 08:15:03

标签: javascript splice

这里有一个数组未定义的数组。我试图打印这个数组的随机元素并剪切它。这是我的代码。

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

当我记录一个数组被切割时,我看到它总是好的,但有时元素不会被切断!

3 个答案:

答案 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()个来电,而不是单独使用我想让他们远离那些只想获得随机数并使用它的“逻辑”代码。
  • 我改变这个功能的原因是在计算机科学中有一个独特的上限更常见 - 它通常与集合之类的东西一起使用0索引。您通常编写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...
}