2015-07-26 2 views
0

Я создаю игру типа щелчка, и мне нужно выяснить, правильно ли выбран пользователь, сравнив его с массивом.Проверить значение против массива и вернуть другое значение

Это JSON

{ 
    quiztitle: "Select the States", 
    correct_answers: "9", 
    states: [ 
     { 
     state_name: "Alabama", 
     image: "alabama_image", 
     answer: "correct" 
     }, 

     { 
     state_name: "Alberta", 
     image: "alberta_image", 
     answer: "incorrect" 
     }, 
ect... 

Когда пользователь нажимает на кнопку, она принимает значение и нужно проверить, если это правильно. Каков наилучший способ сделать это.

Это моя попытка до сих пор:

$('body').on('click', '.matchBtns', function(){ 
        var value = $(this.innerHTML); 
        if($.inArray(value, data.states)){ 
         //its in the array 
         }else{ 
         //its not 
         } 
      }); 

Я не уверен, как получить доступ к значению «ответ», чтобы проверить, если правильно или нет

Это кнопка HTML

<button class="matchBtns">*State Name Here*</button> 

ответ

2

У вас есть немного пути, но есть еще много сделать. Во-первых, вам не нужен объект jQuery для текста внутри кнопки; вы просто хотите текст. Поэтому вы можете сделать что-то вроде этого:

var value = $(this).text(); 

Во-вторых. $.inArray не будет работать по двум причинам. Один - это многомерный массив объектов. Два - вы не просто хотите проверить, находится ли он в массиве; вы хотите проверить, находится ли он в массиве и имеет правильное свойство.

Таким образом, вы можете перебрать массив и посмотреть, если какой-либо из ответов являются правильными:

$('body').on('click', '.matchBtns', function() { 
    var value = $(this).text(); 
    var correct = false; 

    $.each(data.states, function(i, state) { 
     if (state.state_name == value && state.answer == 'correct') { 
      correct = true; 
      return false; // break out of $.each() 
     } 
    }); 

    if (correct) { 
     // true 
    } 
    else { 
     // false 
    } 
}); 

Вот рабочий jsFiddle: https://jsfiddle.net/s0gtqjcL/

Вы могли бы упростить это путем сохранения answer (или correct) как булево, а не строка. Таким образом, вы можете сделать что-то вроде этого:

if (state.state_name == value && state.correct) 
+0

Это в настоящее время возвращаются все ответы, как неправильно атм @christian варге – Dale

+0

@Dale Я случайно проверки 'state.correct' вместо' state.answer'. Я исправил это (проверьте мой отредактированный ответ). Убедитесь, что вы прочитали ответы людей, прежде чем копировать их, чтобы увидеть, можете ли вы выявить такие проблемы - это довольно легко заметить, и вы не хотите привыкать просто слепо копировать ответы, надеясь, что они будут работать. Довольно часто вам нужно изменить ответы в соответствии с вашими потребностями. –

+0

Я читал, я обещаю! Просто новый в jquery и слишком усталый. Я ценю вашу помощь, этот код работает сейчас. – Dale

0

, если хотите underscore вы можете попробовать:

$('body').on('click', '.matchBtns', function(){ 
        var value = $(this.innerHTML); 
        if(_.contains(_.pluck(data.states, "answer"), value)) { 
         //is in the array 
         } 
        else{ 
         //is not 
         } 
      }); 

_.pluck(array, "x") является обобщающим для _.map(array, function(x){return x.x;), так что вы не будете пытаться сравнивать строки и объект

0

Вам придется пройти через ответы.

$('body').on('click', '.matchBtns', function(){ 
    ... 
    var value = this.innerHTML; 
    for (var i = 0,l = data.states.length; i< l; i++){ 
     if (data.states[i].state_name === value && data.states[i].answer === 'correct'){ 
      /// is correct 
      break; // to stop the loop 
     }else { 
      // not correct, continue 
     } 
    } 
    ... 
} 
Смежные вопросы