Содержание

Split

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

Правило задается при создании через свойство rule, меняется методом setRule. В качестве значения можно указать функцию или строку – значение пропускается через basis.getter. Функция должна возвращать некоторое значение, которое будет являться ключом группы. Для сравнения значение приводится к строке, а если значение – экземпляр basis.data.Object, то берется его идентификатор (basisObjectId). Для каждого нового значения создается новое подмножество – группа, и добавляется в набор. Если группа становится пустой, то она удаляется из набора.

Группа - это экземпляр класса basis.data.DatasetWrapper. Значение, для которого она была создана, хранится в свойстве ruleValue. В качестве dataset задан набор, который содержит все элементы группы. Если значением группы является экземпляр basis.data.Object, то он будет назначен делегатом.

Для получения объекта группы используется метод getSubset, которому передается ключ группы. Группа возвращается, только если для значения уже существует группа. Если требуется получить группу и при необходимости создать ее, то вторым параметром передается конфиг для группы или true.

Класс для объекта группы определяется свойством subsetWrapperClass (по умолчанию basis.data.DatasetWrapper), а класс для набора – subsetClass (по умолчанию basis.data.ReadOnlyDataset). Управляет группами экземпляр класса basis.object.KeyObjectMap. Его можно задать при создании набора, указав в свойстве keyMap экземпляр basis.object.KeyObjectMap или конфиг для него.

Набор слушает изменения в элементах источника и перемещает элемент из одной группы в другую, при необходимости.

var Dataset = basis.require('basis.data').Dataset;
var Split = basis.require('basis.data.dataset').Split;

var data = basis.require('basis.data').wrap([
  { city: 'Moscow', country: 'Russia' },
  { city: 'St. Peterburg', country: 'Russia' },
  { city: 'Orenburg', country: 'Russia' },
  { city: 'Washington', country: 'USA' },
  { city: 'New York', country: 'USA' },
], true);
var cities = new Dataset({
  items: data
});
var splitByCountry = new Split({
  source: cities,
  rule: 'data.country'
});

console.log(splitByCountry.getItems());
// console> [{ ruleValue: 'Russia', .. }, { ruleValue: 'USA', .. }]

console.log(splitByCountry.getSubset('Russia', true).itemCount);
// console> 3

console.log(splitByCountry.getSubset('Russia', true).getValues('data.city'));
// console> [{ data: { city: 'Moscow', .. }, .. }, .. ]

console.log(splitByCountry.getSubset('Unknown'));
// console> undefined