Backbone.js предоставляет минималистичную архитектуру для создания клиентских приложений, построенных вокруг моделей, коллекций и вьюшек. Для работы с большими наборами данных в коллекциях особенно важны возможности фильтрации и поиска. Эти функции позволяют эффективно управлять отображением данных и организовывать динамическое взаимодействие с пользователем.
Коллекции Backbone.js наследуются от Backbone.Collection
и предоставляют набор встроенных методов для работы с моделями:
find — возвращает первую модель, удовлетворяющую
переданному условию.filter — возвращает массив моделей, удовлетворяющих
условию.where — фильтрует коллекцию по конкретным атрибутам
модели.findWhere — возвращает первую модель, соответствующую
заданным атрибутам.Пример фильтрации по атрибутам:
var tasks = new Backbone.Collection([
{id: 1, title: 'Сделать уроки', completed: false},
{id: 2, title: 'Сходить в магазин', completed: true},
{id: 3, title: 'Прочитать книгу', completed: false}
]);
var completedTasks = tasks.where({completed: true});
console.log(completedTasks); // Массив с одной завершенной задачей
Метод where полезен, когда известны точные значения
атрибутов. Для более сложных условий применяется filter с
функцией-предикатом:
var longTasks = tasks.filter(function(task) {
return task.get('title').length > 10;
});
console.log(longTasks); // Массив задач с длинными названиями
findfind возвращает первую модель, удовлетворяющую условию,
что удобно при поиске уникальных элементов:
var task = tasks.find(function(task) {
return task.get('title').includes('магазин');
});
console.log(task.get('title')); // "Сходить в магазин"
Для поиска по конкретным атрибутам применяется
findWhere:
var specificTask = tasks.findWhere({id: 2});
console.log(specificTask.get('title')); // "Сходить в магазин"
При необходимости создавать более сложные фильтры используется комбинация методов коллекции. Например, фильтрация по завершенности и длине названия:
var filteredTasks = tasks.filter(function(task) {
return !task.get('completed') && task.get('title').length > 10;
});
Можно объединять фильтры с сортировкой, используя методы коллекции и модели:
var sortedTasks = filteredTasks.sortBy(function(task) {
return task.get('title').length;
});
В реальных приложениях фильтрация и поиск обычно комбинируются с вьюшками для динамического обновления интерфейса. Например, можно создать метод в коллекции для возвращения текущих задач по критериям поиска:
var TaskCollection = Backbone.Collection.extend({
search: function(query) {
return this.filter(function(task) {
return task.get('title').toLowerCase().includes(query.toLowerCase());
});
}
});
var tasksCollection = new TaskCollection(tasks);
var searchResults = tasksCollection.search('книга');
В этом примере коллекция сама обрабатывает поиск, освобождая вьюшку от лишней логики.
При больших коллекциях важно учитывать производительность. Для этого можно:
_.groupBy, для быстрого поиска по категориям.Пример использования groupBy для ускорения поиска по
статусу:
var grouped = _.groupBy(tasks.models, function(task) {
return task.get('completed') ? 'completed' : 'pending';
});
console.log(grouped.completed); // Все завершенные задачи
Backbone.js поддерживает события add,
remove, change в коллекциях. Это позволяет
обновлять результаты фильтрации автоматически при изменении моделей:
tasks.on('change:completed', function() {
var completedTasks = tasks.where({completed: true});
console.log('Обновленный список завершенных задач', completedTasks);
});
Такой подход обеспечивает реактивность интерфейса без необходимости вручную пересчитывать фильтры после каждого изменения.
Backbone тесно интегрирован с Underscore.js. Методы коллекций
(filter, find, where,
map, sortBy) построены на функционале
Underscore, что позволяет использовать его расширенные возможности для
сложных фильтров и поиска:
var taskTitles = _.chain(tasks.models)
.filter(task => !task.get('completed'))
.map(task => task.get('title'))
.sortBy()
.value();
console.log(taskTitles); // Список незавершенных задач по алфавиту
Такой подход позволяет создавать мощные цепочки обработки данных без громоздких циклов.
where и findWhere для простых
фильтров по атрибутам.filter и find для сложных
условий и пользовательских функций-предикатов.Фильтрация и поиск в Backbone.js — фундаментальные инструменты для работы с динамическими коллекциями, позволяющие строить гибкие, производительные и отзывчивые интерфейсы.