2017-08-17 9 views
1

JSONフィードから記事をランダムに選択するのに役立つjavascript関数をいくつか書いています。Javascript - 予期しない結果を返す関数

私は、2つのパラメータを取るgetRandomNumberFromRangeという関数を作成しました。これは、選択する範囲の数値の最小値と最大値です。無作為に選択される記事の数は、最終的に記事が取り込まれるDOM要素のデータ属性を介して提供されます。

第2の関数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

答えて

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; 
} 

あなたは再帰関数の結果を得るためにrandomNumbergetRandomNumberFromRangeを設定する必要があります。

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>

+0

D'OH!そのような派閥の誤り。本当にありがとう! –

関連する問題