使用Javascript搜索数组中的项

使用Javascript搜索数组中的项,javascript,jquery,arrays,Javascript,Jquery,Arrays,我试图添加一些代码,用户点击一个按钮,代码生成3个数字(没有重复,所以245是可以的,但122和121不是),并在屏幕上显示它们,每秒一个。为了确保没有重复,我使用了一个数组:var usedNums=[]。然后,我创建数字(digit=Math.random())并检查它是否已经在数组中,如果它不在数组中,则添加它,如下所示: if ($.inArray(digit, usedNums) !== -1) { newNums(); } else { use

我试图添加一些代码,用户点击一个按钮,代码生成3个数字(没有重复,所以245是可以的,但122和121不是),并在屏幕上显示它们,每秒一个。为了确保没有重复,我使用了一个数组:
var usedNums=[]。然后,我创建数字(
digit=Math.random()
)并检查它是否已经在数组中,如果它不在数组中,则添加它,如下所示:

if ($.inArray(digit, usedNums) !== -1) {
        newNums();
    } else {
        usedNums.push(digit);
        $('#memDigit').html(digit);

}
前几次,它是有效的,但是当我第十次单击它时,我得到了
uncaughtrangeerror:超过了最大调用堆栈大小
error。救命啊

以下是完整的代码:

var usedNums = [];
var digit;
var amount = 3;

function newNums() {
    digit = Math.floor(Math.random() * 10);
    if ($.inArray(digit, usedNums) !== -1) {
        newNums();
    } else {
        usedNums.push(digit);
        $('#memDigit').html(digit);

    }

}

function createNums() {
    for (var i; i < amount; i++) {
        setTimeout(newNums, 1000);
    }
}

//$(document).ready(createNums);
var usedNums=[];
var数字;
风险价值金额=3;
函数newNums(){
数字=Math.floor(Math.random()*10);
如果($.inArray(数字,使用数)!=-1){
newNums();
}否则{
使用数。推送(数字);
$('#memDigit').html(数字);
}
}
函数createNums(){
对于(var i;i<金额;i++){
setTimeout(newNums,1000);
}
}
//$(文档).ready(createNums);

我认为您应该在每个数字生成完成后清空/重新初始化使用的数组

我认为您应该在每个数字生成完成后清空/重新初始化数组usedNums

如果IE[sortVal,num]) .sort(([a],[b])=>ab)) .map(([,num])=>num) .切片(0,3);
ES5:

var nums=[].slice.call(crypto.getRandomValues(新的Int16Array(10)))
.map(函数(sortVal,num){return[sortVal,num];})
.sort(函数(a,b){返回a[0]b[0]);})
.map(函数(对){返回对[1];})
.切片(0,3);
细分:

  • 新建Int16Array(10)
    创建长度为10的空类型Darray
  • crypto.getRandomValues(…)
    用随机值填充该数组
  • 我们将结果转换为正则数组
  • 我们将其映射到[randomVal,index]元组
  • 我们根据随机值对其进行排序(记住强制显式编号,以覆盖Safari
    sort
    implementation bug)
  • 我们只映射到索引,即0-9之间的数字
  • 我们只获取前三个值
如果IE[sortVal,num]) .sort(([a],[b])=>ab)) .map(([,num])=>num) .切片(0,3);
ES5:

var nums=[].slice.call(crypto.getRandomValues(新的Int16Array(10)))
.map(函数(sortVal,num){return[sortVal,num];})
.sort(函数(a,b){返回a[0]b[0]);})
.map(函数(对){返回对[1];})
.切片(0,3);
细分:

  • 新建Int16Array(10)
    创建长度为10的空类型Darray
  • crypto.getRandomValues(…)
    用随机值填充该数组
  • 我们将结果转换为正则数组
  • 我们将其映射到[randomVal,index]元组
  • 我们根据随机值对其进行排序(记住强制显式编号,以覆盖Safari
    sort
    implementation bug)
  • 我们只映射到索引,即0-9之间的数字
  • 我们只获取前三个值

您需要包括所有相关代码以及它们如何组合在一起。您是否清空/重新初始化过使用的数组?@WadihM。是的,我要去。你认为这就是问题所在吗?几乎可以肯定。更好的选择是:制作一个数字0-9的数组,并获取数组中的前3个数字。你需要包括所有相关的代码以及它们如何组合在一起。你是否清空/重新初始化过使用的数组?@WadihM。是的,我要去。你认为这就是问题所在吗?几乎可以肯定。一个更好的选择是:创建一个数字0-9的数组,并获取数组中的前3个数字。好主意,但为什么不使用
Math.random()
?主要是因为使用
Math.random
,至少在原始示例中是这样使用的,意味着您必须获取未知数量的值,直到找到满足约束的值为止。诚然,在足够长的时间内重复获取相同的数字以影响用户的几率非常低,但无论DOM何时已经提供了一个API,让您可以在固定时间内完成这项工作,这似乎都有点骇人听闻。另一个喜欢使用
getRandomValues
的潜在原因-不清楚这是否重要-是它据称是加密安全的,不像
Math.random
。好主意,但为什么不使用
Math.random()
?主要是因为使用
Math.random
,至少与原始示例中使用的一样,这意味着您必须获取未知数量的值,直到找到满足约束的值为止。诚然,在足够长的时间内重复获取相同的数字以影响用户的几率非常低,但无论DOM何时已经提供了一个API,让您可以在固定时间内完成这项工作,这似乎都有点骇人听闻。另一个选择
getRandomValues
的潜在原因是它据称是加密安全的,不像
Math.random
const nums = [ ...crypto.getRandomValues(new Int16Array(10)) ]
  .map((sortVal, num) => [ sortVal, num ])
  .sort(([ a ], [ b ]) => a < b ? -1 : Number(a > b))
  .map(([ , num ]) => num)
  .slice(0, 3);
var nums = [].slice.call(crypto.getRandomValues(new Int16Array(10)))
  .map(function(sortVal, num) { return [ sortVal, num ]; })
  .sort(function(a, b) { return a[0] < b[0] ? -1 : Number(a[0] > b[0]); })
  .map(function(pair) { return pair[1]; })
  .slice(0, 3);