Операции над коллекциями объектов Backbone.js

Для работы с коллекциями в Backbone.js импортируется 28 методов из библиотеки Underscore.js. Среди них, пожалуй, самыми востребованными являются .forEach(), .filter(), .reject(), .find(), .without().

Предположим, что нужно найти в коллекции элементы, соответствующие определённому условию и уничтожить их.


var boxes = new Boxes(); // коллекция объектов
// предположим, что она уже заполнена нужными данными
var boxesToDestroy = boxes.filter(function (box) {
  return box.isReadyToDestroy();
});
_.forEach(boxesToDestroy, function (box) {
  box.destroy();
});

Выглядит громоздко. Всё это по тому, что методы Underscore.js возвращают массив, а не новый экземпляр коллекции.

Благо в Underscore.js есть метод .chain(), который позволяет всё значительно упростить.


boxes.chain()
  .filter(function (box) { return box.isReadyToDestroy(); })
  .forEach(function (box) { box.destroy(); });

Этот код можно ещё упростить, воспользовавшись методом .invoke().


boxes.chain()
  .filter(function (box) { return box.isReadyToDestroy(); })
  .invoke("destroy");

Так можно стоить цепочки из любых операций над элементами коллекции. Если по завершению цепочки нужно будет сохранить результат выборки в переменную, то последним вызовем метод .value().