2012-09-29 65 views
0

我有一個列表顯示在一個頁面上的長列表中的〜100個產品。每個產品屬於一個類別,我有大約5個類別。每個產品都有一個category_id。Backbone.js性能 - 添加一個類到嵌套集合的第一個和最後一個模型

我想爲類別的每個第一個產品和'.last'類的每個最後一個產品添加'.first'類。

性能是關鍵,我自己想出了一些解決方案,但寫得很差,太麻煩。

示例數據:

products = { 
    id: 1, category_id: 1; 
    id: 2, category_id: 1; 
    id: 3, category_id: 1; 
    id: 4, category_id: 2; 
    id: 5, category_id: 2; 
    id: 6, category_id: 2; 
    id: 7, category_id: 3; 
    id: 8, category_id: 3; 
    ... 
} 

結果我在尋找:

<ul> 

    <li class='first' id='1'></li> 
    <li id='2'></li> 
    <li class='last' id='3'></li> 

    <li class='first' id='4'></li> 
    <li id='5'></li> 
    <li class='last' id='6'></li> 

    <li class='first' id='7'></li> 
    <li id='8'></li> 
    ... 
</ul> 

編輯:謝謝你的幫助@niemand!我用groupBy,這是我迄今爲止。這是一個很好的方法來解決這個問題,表現明智嗎?

window.firsts = [] 
window.lasts = [] 
@grouped = _.groupBy(@collection.toJSON(), 'category_id') 
_.each @grouped, (group) -> 
    window.firsts.push new App.Models.Piece(_.first(group)).get('id') 
    window.lasts.push new App.Models.Piece(_.last(group)).get('id') 

這樣我可以檢查是否window.firsts或window.lasts包含當前模型的ID,當我呈現出每個模型視圖和運用正確的類。如果有更高性能的方法來解決這個問題,我很想知道!

+0

爲什麼你不告訴我們你已經嘗試過什麼? – m90

回答

0

使用Backbone.Collection.where({category_id: <category_id>})創建一個2維數組,其中包含按類別分組的模型。那麼您將能夠輕鬆找到所需的數據。或者,如果您不介意類別內部模型的順序,那麼只需Backbone.Collection.sortBy(),遍歷集合並找到所有索引,其中category_id被更改爲。

如果您有category_id的列表並且它很小,第一種方法會更好。第二個對於大量數據更好。

編輯:

有一個下劃線功能GROUPBY()對集合!所以你應該使用它:collection.groupBy(function(model) {return model.get('category_id');});

相關問題