2013-06-14 2 views
1

Я изучаю JS и должен делать мелочи, где каждый вопрос имеет 4 возможных ответа. Вопросы задаются мне в строке с «#», которая разделяет вопросы и «@», что отделяет каждый вопрос от его идентификатора, его текста и правильного ответа. Для ответов у меня есть строка со схожим форматом: idQuestion @ idAnswer @ textOfAnswer # Я знаю, что сделал это очень опасным способом (я использую 4 массива !._.), Но я не могу понять другого пути сделать это. Это код, где я исхожу из строки, которая содержит ответы, и преобразование каждого ответа в «ассоциативный массив», который сохраняется в индексированной ответ ... называется assocAnswers (WTF XD):Итерации по ассоциативным массивам внутри индексированного массива

var indexAnswers = strAnswers.split("#"); 
var auxArray = new Array(); 
var auxArray2 = new Array(); 
var assocAnswers = new Array(); 
for (var b=0; b<indexAnswers.length; b++){ 
    auxArray = indexAnswers[b].split("@"); 
    auxArray2 = { 
     "idQuestion":auxArray[0], 
     "idAnswer":auxArray[1], 
     "txtAnswer":auxArray[2] 
    } 
    assocAnswers.push(auxArray2); 
} 

Я хочу знать, как мне удастся проверить, является ли значение idQuestion (который является первым ключом в каждом «ассоциативном массиве», который занимает один элемент индексированного массива) равен x number. Как только я проверил это, я должен найти оставшиеся 3 ответа, также совпадающие с idQuestion, и отобразить четыре ответа в div (так что я должен отображать значение ключа txtAnswer), каждый ответ в <label> внутри радио ввод, но Я думаю Мне не нужна помощь с частью jQuery. Кстати, я еще не научился ... в цикле, поэтому, если кто-то использует его для возможного решения, любое объяснение этого будет более чем приветствуемым: P Спасибо!

Edit: Некоторые примеры strQuestions на английском языке (strAnswers остается по-испански):

var strQuestions = "[email protected] is a function without parameters [email protected]#" 
+ "[email protected] of the next invocations is [email protected]#" 
+ "[email protected] a function: myFunction(a,b) Which is the correct [email protected]#"; 

var strAnswers = 
"[email protected]@ function:myFunction()#[email protected]@ function myFunction()#[email protected]@ declare myFunction()#[email protected]@ new myFunction#[email protected]@Resultado=myFunction#[email protected]@Call myFunction()#[email protected]@myFunction#[email protected]@Resultado=myFunction()#[email protected]@MiFuncion a,b#[email protected]@a=MiFuncion(b)#[email protected]@MiFuncion(x,y)#[email protected]@Ninguna de las anteriores# 
+1

Можете ли вы предоставить некоторые те же данные, что в настоящее время передается в? – Justin

+0

Я отправлю данные, но это на испанском языке ... Ответы того же вопроса имеют один и тот же idQuestion, но разные idAnswer, будучи последним с 1 по 4. – user2484181

ответ

0

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

Вероятно, лучший способ для петель for, но в данный момент я не могу думать об этом с головы. Я обновлю его, если смогу запомнить.

JSfiddler.

Примечание: anwserId хранится в .key собственности

0

Это то, что вы ищете?

var indexAnswers = strAnswers.split("#"); 
var auxArray = new Array(); 
var auxArray2 = new Array(); 
var assocAnswers = new Array(); 
for (var b=0; b<indexAnswers.length; b++){ 
    auxArray = indexAnswers[b].split("@"); 
    if (auxArray[0].toString() == someId.toString()) { 
     ... Fill your page 
    } 
} 
+0

Эту, я так не думаю. Если я правильно понял, ваш код сохраняет все конечные данные в индексированном массиве, не так ли? Нравится: 'auxArray = (1,1, text, 1,2, text ...); ' Я думаю, что было бы более эффективно, если бы я использовал« ассоциативный массив ». Спасибо, в любом случае! : D – user2484181

+0

на самом деле не хранилище здесь, просто тест, чтобы найти элемент, который вы хотите отобразить на странице, путем сравнения [0] с номером x (someId). Но эй, здесь уже есть хороший ответ от elclanrs. – JoseTeixeira

1

Позвольте мне увидеть, если я понимаю вашу проблему правильно ...

Я знаю, что я сделал это в очень сложном пути (я использую 4 массивы! ._.), Но Я не могу понять, как это сделать.

var data = '[email protected]@hello#[email protected]@foo#[email protected]@world'; 

var questions = data.split('#').map(function(q) { 
    q = q.split('@'); 
    return { 
    idQuestion: q[0], 
    idAnswer: q[1], 
    text: q[2] 
    }; 
}); 

Теперь у вас есть объект с пар ключ: значение. Это, как вы можете фильтровать по любым критериям:

var filteredQuestions = questions.filter(function(q) { 
    return q.idQuestion == 1; 
}); 

console.log(filteredQuestions); //=> [{...text: "hello"}, {...text: "world"}] 
+0

Не знал '.map' и' .filter'. Если я просто скопирую код в jsFiddle, изменив 'console.log' на' alert', он отобразит '[object, Object], [object, Object]'. Из того, что я понял о вашем коде, не следует ли отображать «привет», «мир», как вы писали в комментариях? Благодаря! – user2484181

+0

'filtersQuestions' содержит два объекта, которые были отфильтрованы' idQuestion'. Если вам нужен текст этих вопросов, вам придется снова использовать «map» и вернуть «текст». – elclanrs

+0

Хорошо, я постараюсь полностью понять ваш код (так, как вы заявили, что функции и используемые методы ** полностью ** для меня) и реализовать его как-то. Спасибо за ваше время! – user2484181

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