Методы итерации и трансформации

Backbone.js предоставляет набор инструментов для структурирования фронтенд-приложений, где центральную роль играют модели, коллекции и вьюхи. Методы итерации и трансформации являются ключевыми для работы с коллекциями и позволяют эффективно обрабатывать данные.

Коллекции и их роль

Backbone.Collection представляет собой упорядоченный набор моделей одного типа. Основная задача коллекции — хранение моделей и предоставление удобных методов для работы с ними. Коллекции наследуют большое количество методов от Underscore.js, включая методы для итерации и трансформации: each, map, filter, reduce, find, sortBy и другие.

Метод each

Метод each позволяет выполнить функцию для каждой модели коллекции. Он возвращает исходную коллекцию, что позволяет использовать цепочку вызовов.

var tasks = new Backbone.Collection([
  { id: 1, title: "Сделать домашку", done: false },
  { id: 2, title: "Купить продукты", done: true }
]);

tasks.each(function(task) {
  console.log(task.get('title'));
});

Особенности each:

  • Работает по принципу обхода всех элементов коллекции.
  • Может принимать контекст (thisArg) для вызова функции.
  • Не изменяет коллекцию и не возвращает значения функций внутри.

Метод map

Метод map применяется для трансформации данных коллекции. Он возвращает новый массив с результатами вызова функции для каждой модели.

var titles = tasks.map(function(task) {
  return task.get('title');
});
// titles = ["Сделать домашку", "Купить продукты"]

Преимущества map:

  • Создает новый массив без изменения оригинальной коллекции.
  • Позволяет преобразовывать модели в любые формы данных, включая объекты или строки.

Метод filter (или select)

Метод filter возвращает массив моделей, удовлетворяющих заданному условию.

var doneTasks = tasks.filter(function(task) {
  return task.get('done');
});
// doneTasks содержит модели с done = true

Важные моменты:

  • Возвращается массив моделей, а не коллекция.
  • Для получения новой коллекции используется new Backbone.Collection(filteredArray).

Метод reduce (или inject)

Метод reduce аккумулирует значения, обходя коллекцию по порядку. Часто используется для подсчета, суммирования или объединения данных.

var totalTasks = tasks.reduce(function(sum, task) {
  return sum + 1;
}, 0);
// totalTasks = 2

Особенности reduce:

  • Первый аргумент — функция аккумуляции.
  • Второй аргумент — начальное значение аккумулятора.
  • Позволяет выполнять сложные агрегирующие операции над коллекцией.

Метод find (или detect)

Метод find возвращает первую модель, удовлетворяющую условию.

var firstDone = tasks.find(function(task) {
  return task.get('done');
});
// firstDone — модель с id = 2

Примечание: если ни одна модель не удовлетворяет условию, возвращается undefined.

Метод sortBy

Метод sortBy создает новый массив моделей, отсортированный по заданному критерию.

var sortedTasks = tasks.sortBy(function(task) {
  return task.get('title').length;
});
// Сортировка по длине названия задачи

Особенности:

  • Возвращается массив, а не коллекция.
  • Для обновления порядка в самой коллекции используется collection.comparator и collection.sort().

Цепочки вызовов и комбинирование методов

Методы итерации и трансформации можно комбинировать для построения сложной логики обработки данных.

var unfinishedTitles = tasks
  .filter(task => !task.get('done'))
  .map(task => task.get('title'));
// unfinishedTitles = ["Сделать домашку"]

Преимущества цепочек:

  • Читаемость кода.
  • Минимизация побочных эффектов.
  • Возможность гибкой фильтрации и преобразования данных без изменения исходной коллекции.

Итоговая структура

Работа с коллекциями Backbone.js строится на следующих принципах:

  1. Не изменять исходные данные при трансформации, использовать методы map, filter, sortBy.
  2. Использовать each для побочных эффектов, например, логирования или вызова функций в DOM.
  3. Применять reduce для вычислений на основе всех моделей.
  4. Комбинировать методы для получения нужного результата в компактной форме.

Методы итерации и трансформации Backbone.js обеспечивают мощный и гибкий инструмент для работы с данными, позволяя создавать читаемый и поддерживаемый код, минимизируя прямое управление коллекциями вручную.