2012-03-23 73 views
4

我有拥有(例如)30个项目的Backbone.js集合。通过索引筛选Backbone.js集合

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

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

回答

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

多你可以使这个更好一点,通过使用下划线each方法暴露在Underscore.js在骨干Collections:

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 
+0

感谢您的详细解答! – liorix 2012-03-23 14:56:27

2

骨干收集有一些有用的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的例子。