使用Javascript搜索数组中的项目

时间:2016-12-18 03:45:07

标签: javascript jquery arrays

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

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

}

前几次,它可以工作,但是当我第10次点击它时,我收到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);

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果IE&lt; = 10不是问题,您可能希望利用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(...)使用随机值填充该数组
  • 我们将结果转换为常规数组
  • 我们将其映射到[randomVal,index]元组
  • 我们按随机值排序(记住明确强制转换为Number,以涵盖Safari sort实现错误)
  • 我们向下映射到索引 - 即0-9
  • 的数字
  • 我们只抓取前三个值