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>
我正在编写几个 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>