2013-05-16 84 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爲未定義錯誤。我想我的問題是兩部分 - 爲什麼會返回 K是未定義的,我錯過了關於抓取教育集合的子集?我覺得嵌套循環是多餘的工作,不需要開心。這可能是因爲我誤解了Backbone如何處理集合,或者這是實現我的目標的最佳方式嗎?

+0

'this'指的是什麼?我沒有看到任何與「學校」相關的內容。 –

+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"]

編輯:對不起,我沒有當場嵌套的水平,但由於採摘它只是一個地圖的應用程序,你可以做這樣的事情:

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(...)未定義。我覺得這是我在這裏俯瞰的簡單東西。我從錯誤的角度來看這個嗎?是否可以像我想要的那樣深入研究一個Collection,類似於使用xpath獲取嵌入到XML對象中的元素? – js1983