过滤具有多个属性的主干集合

时间:2013-02-19 01:30:39

标签: jquery backbone.js underscore.js

伙计,我有一个嘉宾收藏。每位客人都有一个inDate,一个outDate和正在占用的床的id_beds。 我试图过滤所有客人同时满足以下声明:

  • id_beds == bed
  • outDate< == date
  • inDate> == date

    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个参数进行过滤。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

这里是使用骨干

过滤收集的简单解决方案

首先在你的收藏中你应该有一个过滤函数,如

 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 ) ;        
相关问题