2015-07-03 6 views
0

Я пытаюсь извлечь данные из объекта, я генерирую 3 случайных числа из 1-9, а затем выбираю данные из объекта json, используя эти случайные числа. Однако иногда он работает, а иногда и нет, я думаю, что это может быть потому, что он не дожидается генерации случайных чисел перед выбором данных из объекта, все это происходит при загрузке страницы:Дождитесь цикла while до завершения кода

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

Какая ошибка, когда она не работает? Это «Uncaught TypeError: Невозможно прочитать заголовок свойства« неопределенного »..? –

+0

Проверьте скрипку. 'TypeError: jsonfile [article3] undefined' – A1rPun

ответ

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; 
} 
+0

Хороший улов! Только одно примечание - 'Math.ceil()' не является подходящей функцией для использования с 'Math.random()' таким образом. Это всегда должно быть 'Math.floor()' вместо этого - см. Мой ответ для деталей по этой проблеме. Правильной формулой здесь будет 'Math.floor (Math.random() * 9)'. –

2

проблема заключается в том, ваш "jsonfile" массив состоит из девяти элементов. это прерывается, когда вы генерируете случайное число 9, поскольку массивы основаны на нуле, допустимые значения для индексации массива: 0-8

0

это, потому что генератор случайных чисел может генерировать номер 9, но ваш jsonfile имеет только 9 элементов, так что последний индекс 8 .

0

Во-первых, как говорили другие люди номер ом генерируется быть:

Math.floor(Math.random()*9) 

Затем я рассмотрел код, чтобы убедиться в синхронности: http://jsfiddle.net/dbqw79j4/6/

Я сделал рекурсивную функцию, которая называет журналы по arr.length >= 3 и добавить случайное число, если он Безразлично» t существует при об.

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. Таким образом, код должен быть:

var randomnumber = Math.floor(Math.random() * 9); 
Смежные вопросы