在Javascript中将范围内的唯一数字推送到数组

时间:2014-04-04 05:08:18

标签: javascript arrays math

我正在尝试将数字从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个数字。

2 个答案:

答案 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,因此您确实要检查您的数组是否具有索引,而不是值。