更新 :(真实问题的真实环境)
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;
}
答案 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);
})