Javascript - 函数返回意外结果

时间:2017-08-17 19:42:57

标签: javascript random indexof

我正在编写几个javascript函数来帮助从JSON提要中随机选择文章。

我创建了一个名为getRandomNumberFromRange的函数,该函数有2个参数:可供选择的数字范围的最小和最大数量。随机选择的文章数量是通过DOM元素的数据属性提供的,最终将用文章填充。

第二个函数loadStories循环遍历需要检索的文章数量,并调用getRandomNumberFromRange函数来获取数字。此数字最终将用作从JSON提要数组中选择文章的键。

为了确保不会多次选择一个随机数,我创建了一个数组来存储以前选择的数字,我将在选择数字时对其进行检查。如果数字已经在数组中,则选择另一个数字,如果它没有被添加到数组中。

Codepen显示了我到目前为止所拥有的内容。代码也如下所示:

var setupEmployeeStories = function () {
    var
    $element = $(".related-employee-stories"),
    noOfStories = parseInt($element.attr("data-stories")),
    arrSelectedNumbers = [],

    getRandomNumberFromRange = function(min, max) {

        var randomNumber = Math.floor(Math.random() * (max - min) + min);

        if(arrSelectedNumbers.indexOf(randomNumber) === -1){
            arrSelectedNumbers.push(randomNumber);
        }else{
            getRandomNumberFromRange(min, max);
        }

        return randomNumber;
   },

   loadStories = function(){
       for(var i = 0; i < noOfStories; i++){
           var rand = getRandomNumberFromRange(0, 4);
           console.log(rand);
       }

       console.log(arrSelectedNumbers);
   };

   loadStories();

 };

 setupEmployeeStories();

不幸的是,当函数多次选择相同的随机数时,我会从函数中得到一些奇怪的结果。由于某种原因,getRandomNumberFromRange倾向于返回与函数实际拾取的数字完全不同的数字。这可以通过(控制台)记录结果和最终数组(arrSelectedNumbers

)的不同来看出

1 个答案:

答案 0 :(得分:2)

getRandomNumberFromRange = function(min, max) {

    var randomNumber = Math.floor(Math.random() * (max - min) + min);

    if(arrSelectedNumbers.indexOf(randomNumber) === -1){
        arrSelectedNumbers.push(randomNumber);
    }else{
        randomNumber = getRandomNumberFromRange(min, max);
    }

    return randomNumber;
}

您需要将getRandomNumberFromRange设置为randomNumber以获取递归函数的结果。

&#13;
&#13;
var setupEmployeeStories = function () {
    var
    $element = $(".related-employee-stories"),
    noOfStories = parseInt($element.attr("data-stories")),
    arrSelectedNumbers = [],

    getRandomNumberFromRange = function(min, max) {

        var randomNumber = Math.floor(Math.random() * (max - min) + min);

        if(arrSelectedNumbers.indexOf(randomNumber) === -1){
            arrSelectedNumbers.push(randomNumber);
        }else{
            randomNumber = getRandomNumberFromRange(min, max);
        }

        return randomNumber;
   },

   loadStories = function(){
       for(var i = 0; i < noOfStories; i++){
           var rand = getRandomNumberFromRange(0, 4);
           //console.log(rand);
       }

       console.log(arrSelectedNumbers);
   };

   loadStories();

 };

 setupEmployeeStories();
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="related-employee-stories" data-stories="3"></div>
&#13;
&#13;
&#13;