2015-05-05 3 views
3

У меня есть следующий код:Выберите случайный объект из JSON

$.getJSON('js/questions1.json').done(function(data){ 
     window.questionnaire = data; 
     console.log(window.questionnaire); 
     startGame(); 
    }); 

Это приносит JSON от сервера и журналов его в переменную. Теперь после этого, я хочу, чтобы выбрать случайный вопрос, расположенный в questions.json документа:

function pickRandomQuestion(){ 
     window.selectedquestion = window.questionnaire[Math.floor(Math.random * window.questionnaire.length)]; 
     console.log(window.selectedquestion); 
     console.log(window.questionnaire); 
    } 

Однако, когда console.log() переменную selectedquestion, ничего не возвращается, это не определено. Что-то не так с моим кодом? Я втрое проверил его, и я не вижу в этом ничего плохого, но это может быть только моя голова, играющая со мной.

Вот как выглядит JSON:

"q1" : { 
     "question" : "This country is one of the largest wine-producing countries of the world, where wine is grown in every region of the country. Which country is this?", 
     "a"  : "France", 
     "b"  : "Italy", 
     "c"  : "Germany", 
     "d"  : "Australia", 
     "corrrect" : "b" 
    }, 
    "q2" : { 
     "question" : "What is the name for the type of art portrait that deliberately exaggerates a person?", 
     "a"  : "Environmental", 
     "b"  : "Cartooning", 
     "c"  : "Caricature", 
     "d"  : "Tribal", 
     "corrrect" : "c" 
    }, 
    "q3" : { 
     "question" : "Who was the first president of the United States?", 
     "a"  : "Abraham Lincoln", 
     "b"  : "Ronald Reagan", 
     "c"  : "George Washington", 
     "d"  : "Barack Obama", 
     "corrrect" : "c" 
    }... 

ответ

5

Это потому, что math.random является функцией не является свойством.

Изменить это: Math.random()

и becuase window.questionnaire является объект, который вы не можете получить доступ к нему с помощью индексов, то есть (0,1,2)

вы можете сделать это:

function pickRandomQuestion(){ 
     var obj_keys = Object.keys(window.questionnaire); 
     var ran_key = obj_keys[Math.floor(Math.random() *obj_keys.length)]; 
     window.selectedquestion = window.questionnaire[ran_key]; 
     console.log(window.selectedquestion); 
     console.log(window.questionnaire); 
} 
+0

Это сработало! Благодаря! – codeninja

0

Я думаю, что это должно работать

function pickRandomQuestion(){ 
    window.selectedquestion = window.questionnaire['q' + Math.floor(Math.random() * window.questionnaire.length)]; 
    console.log(window.selectedquestion); 
    console.log(window.questionnaire); 
} 
+1

Не похоже, что 'window.questionnaire' будет иметь свойство' length'. Вероятно, вам нужно сделать что-то вроде 'Object.keys (window.questionnaire) .reduce (function (length, key) {return length + (window.questionnaire.hasOwnProperty (key)? 1: 0);}, 0)' – redbmk

1

Вы можете отсортировать данные случайные LY всякий раз, когда вы получите его из JSON:

data.sort(function() { return .5 - Math.random();});

$.getJSON('js/questions1.json').done(function(data){ 
    window.questionnaire = data; 
    window.questionnaire.sort(function() { return .5 - Math.random();}); 
    console.log(window.questionnaire); 
    startGame(); 
}); 

Затем в pickRandomQuestion() вы можете просто взять первый элемент в window.questionnaire, зная, что это было случайно отсортирован.

Примечание: вы также можете всегда сортировать список в обычной процедуре pickRandomQuestion(), но я предполагаю, что вам может понадобиться какая-то логика там, чтобы такой же случайный вопрос возникал не так часто, как это было бы случайно, или так на наименьший pickRandomQuestion() не будет возвращать тот же вопрос, что и текущий.

+0

Ах, не понял, что ваш джон не возвращался, как массив. Это может быть не так полезно тогда :) –

Смежные вопросы