1

伙计们,我有一个客人收藏。每个客人都有一个 inDate、一个 outDate 和占用床位的 id_beds。我正在尝试过滤所有客人同时满足以下陈述:

  • id_beds == 床
  • outDate <== 日期
  • inDate >== 日期

    App.Collections.Guests = Backbone.Collection.extend({
    url: 'guests/',
    model: App.Models.Guest,
    getBooking: function(bed, date){
    var gf = _.filter(this.models, function(model){
        // Get all Guests with id_beds = bed
            // && outDate < date && inDate <= date
    });
    
    console.log(gf);
    return gf;
    }
    });
    

现在,问题是,我不知道如何用这 3 个语句过滤掉集合。首先,不知道如何比较日期,因为它们是字符串并且看不到哪个大于另一个。其次,不知道使用超过 1 个参数进行过滤的逻辑将如何。

有任何想法吗?

谢谢!

4

2 回答 2

5

您快到了。由于您的日期是YYYY-MM-DD简单的字符串比较工作,并且您的过滤器函数应该true在满足三个条件时返回:

getBooking: function(bed, date) {
  var gf = this.models.filter(function(model) {
    return (
      model.get('outDate') > date &&
      model.get('inDate') <= date &&
      model.get('id_beds') === bed
    )
  })
  // ...
  return gf
}
于 2013-02-19T01:46:13.827 回答
1

嗨,这里是使用主干过滤集合的简单解决方案

首先在您的收藏中,您应该有一个过滤功能 Like

 App.Collections.Guests = Backbone.Collection.extend ({
  filtered : function ( ) { 

我建议使用 UnderScore 过滤器,它将为有效返回 true,为无效返回 false,其中 true 是您要查找的内容。使用 this.models 获取当前集合模型 使用 model.get( '' ) 获取要检查的元素

var results = _.filter( this.models, function ( model ) {           
        if ( model.get('id_beds') == bed 
           && model.get('outDate') < date
           && model.get('inDate ') < date ) 
        return true ; 
        return false ;
    });

然后使用下划线映射您的结果并将其转换为 JSON

results = _.map( results, function( model ) { return model.toJSON()  } );

最后返回一个只有结果的新主干集合

return new Backbone.Collection( results ) ;

或者,如果您不想保留集合中的所有数据,而只想保留已过滤的数据,则应重置集合并跳过上面的返回,例如

this.reset( results ) ;        
于 2013-10-18T14:37:19.013 回答