Фильтрация коллекции Backbone.js по индексу - PullRequest
4 голосов
/ 23 марта 2012

У меня есть коллекция Backbone.js, которая содержит (например) 30 элементов.

Я хочу перейти к моей отфильтрованной коллекции, состоящей из каждого третьего элемента в исходной коллекции.

Кто-нибудь знает, как это можно сделать элегантно? Код CoffeeScript является предпочтительным.

Ответы [ 2 ]

6 голосов
/ 23 марта 2012

Предполагая, что 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 в Backbone 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
2 голосов
/ 25 марта 2012

В основе Backbone есть несколько полезных Подчеркнутых методов смешанный.Вы можете использовать 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

Здесь - рабочий пример jsfiddle.

...