2015-01-06 4 views
0

Если у меня есть что-то вроде этого:Javascript доступ объектов в массиве

var quiz = [{ 
    "questionID": "KC2Q4", 
    "correctAnswer": "KC2Q4a" 
},{ 
    "questionID": "KC2Q5", 
    "correctAnswer": "KC2Q5b" 
}]; 

и имеют переменную, которую мы можем назвать «вопрос», который имеет значение строки, как KC2Q4. Как вернуть «correctAnswer» для «questionID», который соответствует переменной «question» в новой переменной «answer»?

+2

Это [SO вопрос] (http://stackoverflow.com/questions/7364150/find-object-by-id-in-array-of-javascript-objects) является то, что вы ищете. –

+0

Да, это именно то, что я искал! Спасибо. Этот пост не появился в моем поиске, прежде чем я опубликовал его. :/ –

ответ

2

Вы должны использовать Array.prototype.filter функцию (примечание filter() является 5.x ECMA-Script родной функции: вам не нужны сторонние библиотеки или рамки !!):

var correctAnswer = "KC2Q4a"; 

// "filter" is like a "where". It iterates each object in your array 
// and returns ones that fit the given condition as a closure: 
var answersFound = quiz.filter(function(question) { 
    return question.correctAnswer == correctAnswer; 
}); 

// You could verify if length > 0, but you want to be sure that 
// there's only a single match for a given correct answer, because I feel 
// that "correctAnswer" is like an unique id... 
if(answersFound.length == 1) { 
    // Since there's a found answer to given "correctAnswer", 
    // you get the single result (i.e. the question object): 
    var answer = answersFound[0]; 
} 

Если вы нашли выше проверки бесполезно (в моем случае, я бы назвал это защитное программирование), вы можете получить объект вопроса непосредственно этот путь:

// Without the checking done in the other code listing, you've two risks: 
// a. "quiz" could contain no question objects and the filter will return zero results 
// meaning that getting first result array index will throw an error! 
// 
// b. "quiz" could contain question objects but what you're looking for isn't 
// present in the so-called array. Error too! 
var answer = quiz.filter(function(question) { 
    return question.correctAnswer == correctAnswer; 
})[0]; 
+0

@zerkms Я собирался сделать это. Я обновил свой ответ с вашим предложением. –

+0

@zerkms BTW, я обновил с плюсами и минусами ваше предложение: D –

2

Вы по сути хотите итерации по вашему массиву, проверяя каждый объект для правильного идентификатора вопроса. Когда вы найдете этот объект, верните свойство правильного ответа на этот объект.

var question = "KC2Q4"; 
for(var i=0; i<quiz.length; i++){ 
    if(quiz[i].questionID === question){ 
    return quiz[i].correctAnswer; 
    } 
} 
Смежные вопросы