我正在尝试将数字从1到15插入数组中。 这是代码:
<html>
<head></head>
<body>
<button id="myBtn" value="HELLO">HELLO</button>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
var num = null;
btn.addEventListener('click', function() {
var questions = new Array();
num = Math.floor(Math.random() * 14 + 2);
questions.push(num);
for (var i = 1; i <= 15; i++) {
num = Math.floor(Math.random() * 14 + 2);
if (questions.indexOf(num) !== -1) {
alert(num + " Exists in array. So not pushing it");
} else {
alert(num + " is not found. So pushing it");
questions.push(num);
}
console.log(questions);
}
alert(questions);
})
</script>
</body>
</html>
如果在控制台打开的情况下运行此命令。您会注意到虽然数字不在数组中,但in
运算符仍然会在不推送的情况下丢弃该数字。我能知道为什么以及如何纠正这个问题吗?
还有更好的方法每次以随机顺序插入x个数字。
答案 0 :(得分:1)
您不应将in
运算符与数组一起使用。你应该做的是
if (questions.indexOf(num) !== -1) {
对数组使用in
时,它不会检查值,而是检查数组的索引。这就是你的代码失败的原因。
请检查我的this answer以了解更多信息,为什么不应将in
运算符用于数组。
生成N个唯一随机数的最佳方法是生成数字列表然后随机播放它们,就像这样
function getRandomNumbers() {
var rand, index = 0,
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
array.forEach(function(value) {
rand = Math.floor(Math.random() * ++index);
array[index - 1] = array[rand];
array[rand] = value;
});
return array;
}
console.log(getRandomNumbers());
这是从Underscore.js库的_.shuffle
函数中采用的,它使用Fisher-Yates Shuffle算法对数据列表进行混洗。
答案 1 :(得分:1)
in
运算符适用于objects,因此您确实要检查您的数组是否具有索引,而不是值。