2013-05-16 2 views
1

Учитывая эту коллекцию -Как получить подмножество Backbone.Collection?

{"education": 
[ 
    { 
     "school":{ 
      "name":"Maxwell", 
      "type":"Secondary", 
      "teachers": [ 
       {"name":"Mrs. Smith","subject":"Chemistry"}, 
       {"name":"Mr. Jones","subject":"Calculus"} 
      ] 
     } 
    },{ 
     "school":{ 
      "name":"Bright", 
      "type":"Elementry", 
      "teachers": [ 
       {"name":"Mr. Anthony","subject":"Reading"}, 
       {"name":"Mrs. Bates","subject":"Social Studies"} 
      ] 
     } 
    } 
] 

}

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

Учитывая этот код -

schools = []; 
filtered = this.filter(function (item) { 
     return (
       item.get('school') !== '' 
     ) 
});  
_.each(filtered, function(k,v) { 
    _.each(k.attributes.models, function (k2, v2) {     
     schools.push(k2.get('school')); 
    }); 
}); 
colSchools = new Backbone.Collection(schools);  

Это получает работу, но это не кажется очень эффективным, или действительно правильный способ делать вещи.

Я попытался зацикливание на это вместо фильтрованной, и я получаю сообщение об ошибке, что к неопределен. Мой вопрос, я думаю, состоит из двух частей: почему бы это вернуть k не определено и что мне не хватает в том, чтобы захватить подмножество образовательной коллекции? Я чувствую, что вложенная петля - это лишняя работа, которая не нужна. Может быть, я неправильно истолковываю, как Backbone обрабатывает коллекции, или это действительно лучший способ достичь моей цели?

+0

Что это значит? Я не вижу ничего, что связывает «школы» с этим. –

+0

Я должен был быть более полным в моем вопросе. это относится к коллекции, так как второй набор кодов является частью функции внутри моего backbone.collection.extend. – js1983

ответ

2

Я думаю, что http://backbonejs.org/#Collection-pluck является то, что вы ищете:

var stooges = new Backbone.Collection([ 
    {name: "Curly", age: 60}, 
    {name: "Larry", age: 70}, 
    {name: "Moe", age: 80} 
]); 

var names = stooges.pluck("name"); 

alert(JSON.stringify(names)); 

Если вы попробуете это должно насторожить ["Curly","Larry","Moe"]

EDIT: жаль, что я не заметил вложенную уровня, но с потрохами это всего лишь приложение карты, вы можете сделать что-то вроде этого:

stooges.map(function(model){ 
    return model.get('school').name; 
}); 
+0

В этом конкретном случае выполнение 'this.pluck ('school')' будет возвращено undefined, так как ваш пример не совпадает с моим. Ваш простой объект JSON без иерархии, тогда как в моем примере мне нужны значения школы, которая является потомком «образования». Я хочу знать, есть ли более быстрый способ захватить значения глубоко внутри иерархии коллекции, или мне нужно перебирать коллекцию, как я сделал в вопросе? – js1983

+0

Я обновил свой ответ, извините, это вам помогает? –

+0

К сожалению, я еще не совсем там. См. Эту скрипку http://jsfiddle.net/LneNG/3/ Я попробовал пару вариантов, один с использованием кода, который у меня есть в приложении, и два варианта вашего отредактированного примера. В обоих вызовах «map» результат «undefined», и когда я использовал предложение «.name» в 'get', я получаю' m.get (...) undefined'. Я чувствую, что это что-то простое, я здесь не замечаю. Я иду на это с неправильного угла? Невозможно ли углубиться в коллекцию, как я хочу, подобно использованию xpath для получения элементов, зарытых в объект XML? – js1983

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