在执行代码

时间:2015-07-03 09:03:55

标签: javascript jquery

我正在尝试从对象中检索数据,我从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)

5 个答案:

答案 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上不存在。