[英]Search for item in array with Javascript
我试图在用户单击按钮的地方添加一些代码,该代码生成3个数字(没有重复,因此245可以,但122和121则不可以)并在屏幕上每秒显示一次。 为了确保没有重复,我使用了一个数组: var usedNums = [];
。 然后,我创建一个数字( digit = Math.random()
),并检查它是否已经在数组中,如果不是,则添加它,如下所示:
if ($.inArray(digit, usedNums) !== -1) {
newNums();
} else {
usedNums.push(digit);
$('#memDigit').html(digit);
}
最初的几次,它都有效,但是当我第十次单击它时,我收到了Uncaught RangeError: Maximum call stack size exceeded
错误。 救命!
这是完整的代码:
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);
我认为您应该在每个数字生成完成后清空/重新初始化usedNums数组。
如果IE <= 10 crypto.getRandomValues
,则您可能希望利用crypto.getRandomValues
完成此操作。
getRandomValues
方法使用在该数组类型支持的范围内的一系列随机值填充TypedArray
。 如果我们要求这些值中的10个,则实际上实际上是一个数字0-9(即数组的索引)的散列,该散列预先与随机值相关联以用于按(值)排序。 结果将更加随机,并且-与“已经看到此值,请重试”模式不同-它应在恒定时间内运行。
ES6:
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);
ES5:
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);
分解:
new Int16Array(10)
创建一个长度为10的空TypedArray crypto.getRandomValues(...)
使用随机值填充该数组 sort
实现错误)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.