繁体   English   中英

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

[英]Pushing unique numbers within a range to an array in Javascript

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

您不应in数组中使用in运算符。 你应该做的是

if (questions.indexOf(num) !== -1) {

与数组一起使用in ,它将不检查值,而是检查数组的索引。 这就是您的代码失败的原因。

请检查我的这个答案以了解更多信息,为什么不应该in Arrays中使用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());

这是从_.shuffle库的_.shuffle函数采用的,该函数使用Fisher-Yates Shuffle算法对数据列表进行_.shuffle

in运算符适用于对象 ,因此您实际上要检查数组是否具有索引而不是值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM