Javascript 主干比较器按不同字段类型排序
我有一个要按三个不同字段排序的集合。其中一个字段是布尔值,另一个是整数,第三个是字符串 我希望我的团队集合首先按他们所属的组织id排序,然后按is_主标志(布尔值)排序,最后按字母顺序排列 因此,理想情况下,我的收藏完成后会是这样:Javascript 主干比较器按不同字段类型排序,javascript,sorting,backbone.js,coffeescript,Javascript,Sorting,Backbone.js,Coffeescript,我有一个要按三个不同字段排序的集合。其中一个字段是布尔值,另一个是整数,第三个是字符串 我希望我的团队集合首先按他们所属的组织id排序,然后按is_主标志(布尔值)排序,最后按字母顺序排列 因此,理想情况下,我的收藏完成后会是这样: C队(初级)(组织id 1) A队(组织id 1) B队(组织id 1) D队(初级)(组织id 2) A队(组织id 2) B队(组织id 2) C队(组织id 2) 有没有一个简单的方法可以做到这一点?我试过了 comparator: (team) ->
- C队(初级)(组织id 1)
- A队(组织id 1)
- B队(组织id 1)
- D队(初级)(组织id 2)
- A队(组织id 2)
- B队(组织id 2)
- C队(组织id 2)
comparator: (team) -> [team.get('organization_id'), team.get('name'), team.get('is_primary')]
但这似乎并没有真正起作用。这里有人能帮我吗 我通过以下方法解决了自己的问题:
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)
@teams.comparator = (team) ->
[team.get('organization_id'), if team.get('is_primary') then '0' else '1' + (team.get('name').toLowerCase())]
@teams.sort()
比较器可以定义为
sortBy
(传递一个接受单个参数的函数),可以定义为sort
(传递一个需要两个参数的比较器函数),也可以定义为一个字符串,表示sort by
()的属性。因此,基本上,没有一种简单的方法可以完成我想做的事情?显然,否。通过或排序回调定义排序。这并不像看上去那么难。这似乎对我不起作用:/在尝试了这个之后,什么都没有排序。