Javascript - 函数返回意外结果

Javascript - function returning unexpected results

我正在编写几个 javascript 函数来帮助从 JSON 供稿中随机 select 篇文章。

我创建了一个名为 getRandomNumberFromRange 的函数,它有两个参数:从 select 开始的数字范围的最小和最大数量。 select 随机编辑的文章数量是通过 DOM 元素上的数据属性提供的,该元素最终将填充文章。

第二个函数loadStories循环遍历需要检索的文章数量,调用getRandomNumberFromRange函数得到一个数字。该数字最终将用作 JSON 提要数组中 select 篇文章的关键字。

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

这个 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();

不幸的是,当函数 select 多次使用相同的随机数时,我从函数中得到了一些奇怪的结果。出于某种原因,getRandomNumberFromRange 倾向于 return 与函数实际选择的数字完全不同的数字。这可以通过(控制台)记录的结果和最终数组的差异看出 - 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;
}

您需要将getRandomNumberFromRange设置为randomNumber才能得到递归函数的结果。

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();
<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>