Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干比较器按不同字段类型排序_Javascript_Sorting_Backbone.js_Coffeescript - Fatal编程技术网

Javascript 主干比较器按不同字段类型排序

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) ->

我有一个要按三个不同字段排序的集合。其中一个字段是布尔值,另一个是整数,第三个是字符串

我希望我的团队集合首先按他们所属的组织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) -> [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
()的属性。因此,基本上,没有一种简单的方法可以完成我想做的事情?显然,否。通过或排序回调定义
排序。这并不像看上去那么难。这似乎对我不起作用:/在尝试了这个之后,什么都没有排序。