【问题标题】:Filtering a Backbone.js collection by index按索引过滤 Backbone.js 集合
【发布时间】:2012-03-23 13:03:49
【问题描述】:

我有 Backbone.js 集合,其中包含(例如)30 个项目。

我想传递给我的模板过滤集合,其中包含原始集合中的每 3 个项目。

有谁知道如何优雅地完成它?首选 CoffeeScript 代码。

【问题讨论】:

    标签: collections filter backbone.js coffeescript


    【解决方案1】:

    这里假设originalCollection 是您现有的收藏

    var newCollection = new Backbone.Collection();
    
    for (var i = 0, l = originalCollection.length; i < l; i++) {
      if (i % 3 === 0) { newCollection.add(originalCollection.models[i]); }
    }
    

    此代码通过循环遍历每个现有模型来工作,并且仅当模型的索引是 3 的倍数时才将模型添加到新集合中。

    您可以通过使用 Underscore.js 在 Backbone Collections 中公开的下划线 each 方法来使它更好一点:

    var newCollection = new Backbone.Collection();
    
    originalCollection.each(function (model, index) {
      if (index % 3 === 0) { newCollection.add(model); }
    });
    

    将以上内容转换为 CoffeeScript 会导致:

    newCollection = new Backbone.Collection()
    originalCollection.each (model, index) ->
      newCollection.add model  if index % 3 is 0
    

    【讨论】:

      【解决方案2】:

      Backbone 集合中混入了一些有用的Underscore methods。您可以使用filter 获取可以传递给模板的模型数组:

      filteredModels = collection.filter (model, i) -> i % 3 == 0
      

      或者,您可以使用数组推导;虽然我认为这不太可读......

      filteredModels = (model for model, i in collection.models when i % 3 == 0)
      

      如果您真的需要模板中的 Backbone.Collection,您可以使用这些过滤后的模型创建一个新的:

      filteredCollection = new Backbone.Collection filteredModels
      

      Here 是一个有效的 jsfiddle 示例。

      【讨论】:

        猜你喜欢
        • 2014-03-12
        • 2011-10-27
        • 2012-08-06
        • 2017-09-04
        • 2014-08-20
        • 1970-01-01
        • 2015-11-27
        • 2012-05-10
        相关资源
        最近更新 更多