我正在尝试从对象中检索数据,我从1-9生成3个随机数,然后使用这些随机数从json对象中选择数据。然而,它有时可以工作,有时却没有,我认为可能是因为它不等待从对象中选择数据之前生成随机数,这一切都发生在页面加载上:
jsfiddle: http://jsfiddle.net/dbqw79j4/1/
代码:
var jsonfile =[
{
"id" : "article1",
"image" : "http://images.domain.com/is/image/boss/BOSS_london_bridge_skyline?$c_overview_large$",
"headline" : "<h2>EIN TAG IN LONDON<span class='h2'>MIT LEWIS HAMILTON</span></h2>"
},
{
"id" : "article2",
"image" : "http://images.domain.com/is/image/boss/FAB_5819?$c_overview_large$",
"headline" : "<h2>EIN TAG IN MONACO<span class='h2'>MIT NICO ROSBERG</span></h2>"
},
...
]
var arr = []
var article1;
var article2;
var article3;
var art1hd;
var art1img;
var art2hd;
var art2img;
var art3hd;
var art3img;
while(arr.length < 3){
var randomnumber=Math.ceil(Math.random()*9)
var found=false;
for(var i=0;i<arr.length;i++){
if(arr[i]==randomnumber){found=true;break}
}
if(!found)arr[arr.length]=randomnumber;
}
console.log(arr);
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
article1 = arr[0];
article2 = arr[1];
article3 = arr[2];
console.log(article1)
console.log(article2)
console.log(article3)
art1hd = jsonfile[article1]['headline'];
art1img = jsonfile[article1]['image'];
art2hd = jsonfile[article2]['headline'];
art2img = jsonfile[article2]['image'];
art3hd = jsonfile[article3]['headline'];
art3img = jsonfile[article3]['image'];
console.log(art1hd)
console.log(art1img)
console.log(art2hd)
console.log(art2img)
console.log(art3hd)
console.log(art3img)
答案 0 :(得分:3)
您可以生成0-9范围内的随机数,并且您的数组仅包含9个元素,并且它的编号为0-8
您应该使用:
while(arr.length < 3){
var randomnumber=Math.ceil(Math.random()*8)
var found=false;
for(var i=0;i<arr.length;i++){
if(arr[i]==randomnumber){found=true;break}
}
if(!found)arr[arr.length]=randomnumber;
}
答案 1 :(得分:2)
问题是,你的“jsonfile”数组有九个元素。生成随机数9时会出现这种情况,因为数组是从零开始的,索引数组的有效值是0-8
答案 2 :(得分:1)
Math.ceil()
永远不是基于Math.random()
次生成整数结果的正确函数,如此代码所做的那样:
var randomnumber = Math.ceil( Math.random() * 9 );
您应该始终在此类代码中使用Math.floor()
。如果您不希望范围从0开始,则在执行Math.floor()
后添加范围库。
换句话说,如果你想要一个1到9范围内的随机整数,这是正确的方法:
var randomnumber = Math.floor( Math.random() * 9 ) + 1;
这是为什么?了解Math.random()
生成的值大于或等于 0且小于(但绝不等于)1时,这一点非常重要。
因此Math.random() * 9
给出的值始终小于9(并且永远不等于9)。如果对此进行Math.floor()
,则现在有一个0到8之间的整数。
为此添加1,您的所需范围为1到9。
许多JavaScript引用无法清楚地描述Math.random()
。请记住,其结果位于0 <= Math.random() < 1
。
那么,如果您使用Math.ceil()
会出现什么问题?回到最初的例子:
var randomnumber = Math.ceil( Math.random() * 9 );
这段代码的实际作用是生成0到9范围内的数字,而不是1到9.现在得到0结果的几率非常小:Math.random()
返回0的情况相当少见,但可能发生。通过使用Math.floor()
,您可以确保结果始终在所需范围内。
也就是说,正如suvroc指出的那样,你(最终)使用这个值作为9个元素数组的索引,因此你想要的范围实际上是0到8.所以代码应该是:< / p>
var randomnumber = Math.floor( Math.random() * 9 );
答案 3 :(得分:0)
是的,因为随机数生成器可以生成数字9,但是jsonfile
只有9个元素,所以最后一个索引是8。
答案 4 :(得分:0)
首先,正如其他人所说,生成的随机数为:
Math.floor(Math.random()*9)
然后我查看了代码,以确保同步性: http://jsfiddle.net/dbqw79j4/6/
我做了一个递归函数,调用arr.length >= 3
上的日志并添加一个随机数,如果arr上不存在。