排序集合首先是一列两列,然后是Backbone.js中的第二列

时间:2014-05-14 14:07:00

标签: javascript backbone.js backbone.js-collections

我需要按降序排列有两列的集合,但是第一列考虑第一列的顺序,然后是第二列,一列只是一个标志(0' s和1' s)和另一个包含日期,我想以这样的方式对数据进行排序

  

1,5,20/2014

     

1,5 / 15/2014

     

0,5 / 30/2014

     

0,5 / 25/2014

     

0,4 / 11/2014

这是我的代码看起来像,但不起作用,我不知道我做错了什么。

extendCollection: function(Collection) {
    _.extend(Collection.prototype, {

        comparator : function( model ) {
            var dateCreated = new Date(model.get('dateCreated')).getTime();
            return model.get('isFavorited') > dateCreated ? -1 : 1;
        }

    });
    return Collection;
}

2 个答案:

答案 0 :(得分:2)

来自fine manual

  

比较器 collection.comparator
  [...]比较器可以定义为 sortBy (传递一个带有单个参数的函数),作为 sort (传递一个需要两个参数的比较器函数) ),或作为指示要排序的属性的字符串。

请注意,比较器可以采用两个参数。如果你使用两个参数comparator,那么逻辑很简单:

comparator: function(a, b) {
    var a_fav, b_fav, a_date, b_date;

    a_fav = a.get('isFavorited');
    b_fav = b.get('isFavorited');
    if(a_fav > b_fav)
        return -1;
    if(a_fav < b_fav)
        return 1;

    a_date = new Date(a.get('dateCreated'));
    b_date = new Date(b.get('dateCreated'));
    if(a_date > b_date)
        return -1;
    if(a_date < b_date)
        return 1;

    return 0;
}

不需要奇怪的映射hackery或废话,只需简单明了的比较逻辑。在处理多个排序键,反向字符串排序和其他非平凡的排序任务时,您几乎总是使用Array.prototype.sort - 样式两个参数comparator

如果您在parse方法中将dateCreated字符串属性转换为真实的Date个实例,并且在设置新值时,情况会更简单。

答案 1 :(得分:-1)

这有点像黑客,但这应该做的工作:

return -model.get("isFavorited") * Math.pow(10, 20) - dateCreated

感谢下面的更正。