2015-04-27 41 views
0

我有一個集合,我想按三個不同的字段排序。其中一個字段是布爾值,另一個是整數,第三個字符串。按不同字段類型排序的主幹比較器

我希望我的團隊的集合將他們屬於第一的organization_ID進行排序,然後由is_primary標誌(布爾)進行分類,最後我希望他們可以按字母順序排列。

所以最好我的收藏應該是這樣的,當它這樣做:

  • C組(is_primary)(org_id 1)
  • A隊(org_id 1)
  • B隊(org_id 1)
  • 隊d(is_primary)(org_id 2)
  • 團隊A(org_id 2)
  • 球隊B(org_id 2)
  • Team C(org_id 2)

有沒有簡單的方法來做到這一點?我試過

comparator: (team) -> [team.get('organization_id'), team.get('name'), team.get('is_primary')] 

但是,這似乎並沒有實際工作。任何人都可以爲我提供一些幫助嗎?

+0

_A比較可以被定義爲一個'sortBy'(通過一個函數,一個參數),作爲一個'排序'(傳遞需要兩個參數比較器功能),或作爲指示屬性來排序'by'_一個字符串([給定](http://backbonejs.org/#Collection-comparator)) – hindmost

+0

因此,基本上,有是不是一個簡單的方法來做我想做的事情? – tommybond

+0

顯然,沒有。定義'sortBy'或'sort'回調。這看起來並不難。 – hindmost

回答

0
var Collection = Backbone.Collection.extend({ 
    model: Backbone.Model, 
    sortOrder: ['organization_id', 'is_primary', 'name'], 
    comparator: function(a, b) { 
    var order = 0; 
    _.each(this.sortOrder, function(prop){ 
     var aa = a.get(prop), bb = b.get(prop); 
     aa = _.isBoolean(aa) ? !aa : aa; // true is greater than false, 
     bb = _.isBoolean(bb) ? !bb : bb; // but we want to reverse that 
     order = aa === bb ? 0 : aa > bb ? 1 : -1; 
     return !order; 
    }); 
    return order; 
    } 
}); 

var c = new Collection([ 
    { is_primary: false, organization_id: 1, name: 'A' }, 
    { is_primary: false, organization_id: 2, name: 'A' }, 
    { is_primary: false, organization_id: 1, name: 'B' }, 
    { is_primary: false, organization_id: 2, name: 'B' }, 
    { is_primary: true, organization_id: 1, name: 'C' }, 
    { is_primary: false, organization_id: 2, name: 'C' }, 
    { is_primary: true, organization_id: 2, name: 'D' } 
]); 

c.each(function(t){ 
    console.log('Team %s %s(org_id %d)', t.get('name'), t.get('is_primary') ? '(is_primary) ' : '', t.get('organization_id')); 
}); 

// Outputs: 
Team C (is_primary) (org_id 1) 
Team A (org_id 1) 
Team B (org_id 1) 
Team D (is_primary) (org_id 2) 
Team A (org_id 2) 
Team B (org_id 2) 
Team C (org_id 2) 
+0

這似乎並不爲我工作:在嘗試此方法後所有/沒有排序。 – tommybond

+0

@ tommy.bonderenka http://jsbin.com/tezayeyovo/1/edit?html,js,console – idbehold

0

我最終通過執行以下解決我自己的問題:

@teams.comparator = (team) -> 
    [team.get('organization_id'), if team.get('is_primary') then '0' else '1' + (team.get('name').toLowerCase())] 
@teams.sort()