如何获取Backbone.Collection的子集?

时间:2013-05-16 15:43:10

标签: javascript json backbone.js underscore.js

鉴于这个集合 -

{"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未定义的错误。我想我的问题是两个部分 - 为什么返回 k是未定义的以及我在抓取教育集合的子集时缺少什么?我觉得嵌套循环是多余的工作,不需要开心。可能是我误解了Backbone如何处理集合,或者这真的是实现我的目标的最佳方式吗?

1 个答案:

答案 0 :(得分: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"]

编辑:抱歉,我没有发现嵌套级别,但是因为它只是一个地图应用程序,你可以做这样的事情:

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