Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅在工作时间的一部分进行拼接_Javascript_Splice - Fatal编程技术网

Javascript 仅在工作时间的一部分进行拼接

Javascript 仅在工作时间的一部分进行拼接,javascript,splice,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) { $

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

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);
    }
 });
当我记录一个数组被剪切时,我看到总是可以的,但有时元素并没有被剪切

我猜问题在于您的
randnum
方法:

function rand(min, max){
   return (Math.floor(Math.random() * (max - min + 1)) + min).toFixed(0);
}
我相信这将为您提供一个范围
[min,max]
的值,包括两端。(实际上,当
toFixed
返回一个字符串时,它将为您提供该值的字符串版本,但当您稍后使用它时,它将被强制返回为一个数字。)

现在你这样称呼它:

num = rand(1,chamarr.length);
function rand(min, max) {
   return (Math.floor(Math.random() * (max - min)) + min).toFixed(0);
}
num = rand(0, chamarr.length);
因此,如果数组长度为6个元素,您将获得范围
[1,6]
内的值。但是,您将尝试使用
chamarr[num]
——有效索引的范围是
[0,5]
,因为数组是基于0的。如果您尝试使用元素6,则会得到未定义的
——但在元素6处进行拼接不会产生任何效果

我会将您的
rand
方法更改为上限独占,如下所示:

num = rand(1,chamarr.length);
function rand(min, max) {
   return (Math.floor(Math.random() * (max - min)) + min).toFixed(0);
}
num = rand(0, chamarr.length);
然后这样称呼它:

num = rand(1,chamarr.length);
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索引。您通常为循环编写
    ,包括包含的下界和独占的下界等

    • 问题在于
      num
      是一个超出范围的索引。您应该这样做:

      num = rand(0, chamarr.length - 1);
      

      您可以简化逻辑:

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

      我不知道还有谁,但我不知道你最后一句话的意思。请提供示例输入和输出。(当然,这并不是阻止我将猜测作为答案。JavaScript开发人员,请仔细检查我的答案,因为它假设JS的工作方式与我习惯的语言大致相同:)+1,这肯定解释了问题中的“有时”一词。)而
      arr[arr.length]
      将计算为
      undefined
      ,不会抛出错误。您不应该更改函数本身(它现在返回字符串),而是更改它的调用方式
      (0,length-1)
      或者根本不使用函数
      var num=Math.floor(Math.random()*chamarr.length)
      越界访问实际上将返回
      未定义的
      ,而不是
      null
      ,但您的其余分析是正确的:)@Esailija:为什么不同时更改这两个呢?在我看来,让函数使用
      [min,max)
      的范围在计算机科学中更为惯用。不过,我在提取函数以生成一个范围内的随机数方面没有问题……我不想看到
      Math.floor
      etc调用任何我想要整数的地方。最好去掉
      toFixed(0)
      call尽管如此:)嘿,有一个完整的项目试图在javascript中模拟php的脆弱性