Splice只在部分时间工作

ska*_*ad0 0 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);
    }
 });
Run Code Online (Sandbox Code Playgroud)

当我记录一个阵列被切割时,我看到它总是好的,但有时候元素没有切割!

Jon*_*eet 7

我的猜测是问题在于你的randnum方法:

function rand(min, max){
   return (Math.floor(Math.random() * (max - min + 1)) + min).toFixed(0);
}
Run Code Online (Sandbox Code Playgroud)

相信这会给你一个范围内的价值[min, max]- 包括两端.(嗯,实际上,它会给你一个字符串版本的值作为toFixed返回一个字符串,但是当你以后使用它时它会被强制回一个数字.)

现在你这样称呼它:

num = rand(1,chamarr.length);
Run Code Online (Sandbox Code Playgroud)

因此,如果数组长度为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);
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

num = rand(0, chamarr.length);
Run Code Online (Sandbox Code Playgroud)

这将为您提供索引和拼接的正确范围内的值.

编辑:回应评论等:

  • 这可能是值得删除功能的toFixed(0)一部分rand; 你不真的想要一个字符串,毕竟.这不是以前错误的一部分,但它通常更清洁:

    function rand(min, max) {
       return Math.floor(Math.random() * (max - min)) + min;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可能还需要一个0隐式下限的函数版本

  • 如果你不打算在你的代码中的任何其他地方使用随机数,你可以内联Math.floor()/ Math.random()调用而不是单独的函数,但我个人想要让它们远离那些想要得到的"逻辑"代码随机数并使用它.
  • 我改变这个功能的原因是在计算机科学中有一个独特的上界更常见 - 它通常与集合之类的东西一起使用0索引.您通常会编写for包含下限和独占下限等的循环.