基于条件的JavaScript随机数输出意外行为

时间:2017-10-20 11:25:21

标签: javascript

更新 :(真实问题的真实环境)

http://citibigreveal.stage.aiareview.co.uk/

当您单击底部的4个选项中的任何一个时,您将看到来自以下的console.log值:

var Utilities = (function (array, maxN) {

  function generateRandomNumber(array, maxN) {
        let randomN = Math.floor(Math.random() * maxN) + 0;
        console.log(array.length);
        console.log(maxN);

        if(array.length == maxN) {
            array.length = 0;
        }

        if(!array.includes(randomN)) {
            array.push(randomN);
        }
        else {
            randomN = generateRandomNumber(array, maxN);
        }
        return randomN;
    }

    return {
        generateRandomNumber: generateRandomNumber
    };

})();

export default Utilities;

意外的行为是数组被随机设置为0(只应在其长度等于传入的maxN时才会发生)

以下函数使用该实用程序:

var cityArray = [];

function getRandomNumber() {
    let randomN = Utilities.generateRandomNumber(cityArray, 10);
    return randomN;
}

并在反应组件中调用它:

...
getNewQuestion = () => {
    var randomN = getRandomNumber();
    var catArray = this.state.data.data.questions;
    Shuffle(catArray);
    this.setState({
        question: catArray[randomN]
    })
    this.setCatBgColor(catArray[randomN].category);
}
...

理想情况是:

  • 为生成的每个随机数返回
  • 如果已生成该数字,则将其存储在数组中并生成新的随机数,直到达到ma长度。 你还会注意到有时maxN将是24.(这很奇怪,因为插入的最大值是10),按照:

    function getRandomNumber() {
        let randomN = Utilities.generateRandomNumber(cityArray, 10);
        return randomN;
    }
    

2 个答案:

答案 0 :(得分:0)

  

“generateRandomNumber”中的console.log staments正在多次输出

这是因为你使该函数递归。在这行代码中,您自己调用了函数:randomN = generateRandomNumber(array, maxN);

...所以函数不止一次被调用,会有多条打印消息。

  

我该如何解决这个问题?

如果你想将打印信息移到循环之外,那么,好吧......我想你会知道如何做到这一点。这项工作是功能编程方向的坚实一步。保持良好的工作:)

更好的是,这些行看起来好像是用于高度特定的调试/实验目的,如果你不再使用它们进行调试或试验,你可以(并且应该)删除它们。叶。这将解决你的问题。

答案 1 :(得分:0)

您的代码似乎没有被破坏,至少,您没有指定应该做什么,而不是当前正在做什么。

正如已经指出的那样,generateRandomNumber是递归的,你看到的多个日志输出就是这样的结果。如果你想“修复”它,摆脱输出,例如只记录最后的数组:

var array = [];

$("div").on('click', function(){
  console.log('clicked');
  generateRandomNumber(array, 10);
  console.log(array);
})