Сортировка коллекции в Backbone.js
Backbone.js

Сортировка коллекции в Backbone.js

Коллекция в Backbone.js представляет собой упорядоченный набор моделей. И раз это упорядоченный набор — может возникать необходимость сортировки коллекции или поддержания ее в отсортированном виде по тому или иному атрибуту модели. В статье мы поговорим о способах сортировки коллекций в Backbone.js.

Функция _.sortBy из библиотеки Underscore.js

Функция _.sortBy() из библиотеки Underscore.js принимает два обязательных параметра — массив элементов и функцию сравнения и один необязательный параметр — контекст выполнения. Функция сравнения в свою очередь представляет собой функцию от одного параметра, сортировка будет осуществляться по значениям, которое вернет эта функция.

Чтобы стало немного понятнее, рассмотрим пример использования функции _.sortBy() для сортировки массива:


// вернет [-1, 2, 3, -4, 5, 6]
_.sortBy([5, -4, 6, 3, -1, 2], function(num) { return Math.abs(num); });

Функция сравнения вычисляет абсолютное значение каждого элемента массива, и весь массив сортируется по возрастанию модулей (однако в результирующий массив попадают не модули, а именно исходные элементы).

Функция _.sortBy может также применяться и для коллекции Backbone:


books.sortBy(function(book) {
    return book.get("title").toLowerCase();
});

books.forEach(function(book) {
    console.log(book.get('title'));
});

В примере выше в качестве функции сравнения мы использовали функцию, возвращающую атрибут title модели в нижнем регистре. Соответственно, и вся коллекция у нас будет отсортирована по атрибуту title.

Функция-компаратор

Предыдущий способ сортировки позволяет в нужный момент отсортировать коллекцию по определенному атрибуту. Однако в Backbone.js существует механизм, позволяющий постоянно поддерживать коллекцию в отсортированном состоянии. Для этого необходимо определить свойство comparator коллекции.

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

Также в качестве компаратора может выступать функция от двух параметров, принимаемая методов Array.sort. Такая функция принимает на вход две модели и возвращает 1, если первый аргумент больше второго, и −1, в противном случае.

И наконец, компаратором может быть строка — имя свойства, по которому должны быть отсортированы модели коллекции.

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

Если свойство comparator определено в коллекции, при добавлении модели в колекцию, она сразу будет добавляться в нужное место и коллекция поддерживается в отсортированном состоянии.


var Book = Backbone.Model;
var books = new Backbone.Collection;

books.comparator = function(book) {
    return book.get('author');
};

books.add(new Book({ author: 'Clarke Arthur', title: '2001: A Space Odyssey' }));
books.add(new Book({ author: 'Asimov Isaac', title: 'Foundation and Empire' }));
books.add(new Book({ author: 'Sheckley Robert', title: 'Journey Beyond Tomorrow' }));
books.add(new Book({ author: 'Asimov Isaac', title: 'Second Foundation' }));
books.add(new Book({ author: 'Clarke Arthur', title: '2010: Odyssey Two' }));

console.log(books.pluck('author'));

В примере выше, не смотря на то, что мы добавляли элементы в коллекцию в произвольном порядке, ее элементы отсортированы по атрибуту author.

Обратите внимание, что изменение атрибута, по которому осуществляется сортировка не приводит к пересортировке коллекции и в этом случае необходимо отсортировать коллекцию с помощью метода sort().


books.sort();

Заключение

В статье мы рассмотрели два способы сортировки коллекции в Backbone.js: с помощью метода sortBy и свойства comparator коллекции. Backbone предоставляет возможность не только сортировать коллекцию в нужный момент по определенному атрибуту модели, но и поддерживать ее в отсортированном состоянии.

Рассылка
Подпишитесь на рассылку и получайте дайджест новостей и статей.
Никакого спама!
Подписаться