代码之家  ›  专栏  ›  技术社区  ›  James Howell

Javascript-返回意外结果的函数

  •  1
  • James Howell  · 技术社区  · 7 年前

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

    第二个函数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 回复  |  直到 7 年前
        1
  •  2
  •   Mouser    7 年前
    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>