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的脆弱性