按索引过滤Backbone.js集合

时间:2012-03-23 13:03:50

标签: collections filter backbone.js coffeescript

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

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

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

2 个答案:

答案 0 :(得分:6)

此处假设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的倍数时才添加模型。

通过在Backbone集合中使用Underscore.js公开的下划线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

答案 1 :(得分: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示例。