Backbone.js предоставляет мощные инструменты для управления данными через модели и коллекции. Одними из ключевых возможностей коллекций являются сортировка и фильтрация, которые позволяют эффективно управлять отображением данных в приложении.
Коллекция в Backbone.js представляет собой упорядоченный набор моделей. Порядок элементов внутри коллекции определяется либо порядком их добавления, либо пользовательской функцией сортировки. Каждая коллекция может иметь:
comparator — функция или строка,
задающая порядок элементов.sort и
sortBy для явной сортировки
коллекции.Пример задания компаратора по полю name:
var Users = Backbone.Collection.extend({
comparator: 'name'
});
var users = new Users([
{name: 'Анна', age: 25},
{name: 'Борис', age: 30},
{name: 'Виктор', age: 20}
]);
users.sort();
console.log(users.pluck('name')); // ['Анна', 'Борис', 'Виктор']
Если требуется сложная логика сортировки, можно использовать функцию:
var Users = Backbone.Collection.extend({
comparator: function(user) {
return -user.get('age'); // сортировка по убыванию возраста
}
});
users.sort();
console.log(users.pluck('age')); // [30, 25, 20]
Фильтрация позволяет получать подмножества коллекции по определённым
условиям. Backbone.js предоставляет методы
filter,
where и
findWhere.
filter(predicate) — возвращает массив
моделей, удовлетворяющих функции predicate.var adults = users.filter(function(user) {
return user.get('age') >= 25;
});
console.log(adults.map(u => u.get('name'))); // ['Анна', 'Борис']
where(attributes) — возвращает все
модели, совпадающие с заданными атрибутами.var borises = users.where({name: 'Борис'});
console.log(borises[0].get('age')); // 30
findWhere(attributes) — возвращает
первую модель, совпадающую с заданными атрибутами.var viktor = users.findWhere({name: 'Виктор'});
console.log(viktor.get('age')); // 20
Сортировка и фильтрация часто применяются совместно. Поскольку методы фильтрации возвращают массив, а не коллекцию, для сохранения функциональности Backbone рекомендуется создавать новые коллекции на основе отфильтрованных данных:
var adultsCollection = new Users(users.filter(function(user) {
return user.get('age') >= 25;
}));
adultsCollection.comparator = 'age';
adultsCollection.sort();
console.log(adultsCollection.pluck('name')); // ['Анна', 'Борис']
Это позволяет работать с уже отсортированными и фильтрованными данными как с полноценной коллекцией Backbone.
Коллекции Backbone поддерживают события
add, remove,
change. Это позволяет динамически
обновлять фильтрованные или отсортированные представления при изменении
данных.
Пример реактивного списка:
var AdultUsersView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.collection, 'add remove change', this.render);
},
render: function() {
var adults = this.collection.filter(function(user) {
return user.get('age') >= 25;
});
adults.sort((a, b) => a.get('age') - b.get('age'));
this.$el.empty();
adults.forEach(user => {
this.$el.append('<li>' + user.get('name') + '</li>');
});
return this;
}
});
Любое добавление или изменение модели автоматически обновляет список, сохраняя актуальность данных.
sortBy и groupByМетод sortBy возвращает отсортированный
массив моделей на основе функции или атрибута:
var sortedByAge = users.sortBy('age');
console.log(sortedByAge.map(u => u.get('name'))); // ['Виктор', 'Анна', 'Борис']
Метод groupBy позволяет сгруппировать
модели по значению атрибута:
var groupedByAge = users.groupBy('age');
console.log(groupedByAge[25].map(u => u.get('name'))); // ['Анна']
Комбинация groupBy,
filter и
sortBy предоставляет гибкие возможности
для сложных операций с данными.
filter, where,
findWhere для выборки моделей по условиям.sortBy и
groupBy для краткой и понятной работы с массивами
моделей.Эти инструменты позволяют строить масштабируемые приложения с гибкой логикой отображения данных, сохраняя преимущества структуры Backbone.js.