Содержание

Cloud

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

Для разбиение набора на подмножества 1:1 используется Split.

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

Рассмотрим пример, в котором найдем такие делители от 2 до 10, которые будут нацело делить числа от 2 до 10:

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

var numbers = [2, 3, 4, 5, 6, 7, 8, 9, 10];
var data = basis.require('basis.data').wrap(numbers, true);

var datasource = new Dataset({ items: data });
var cloud = new Cloud({
  source: datasource,
  rule: function(item) {
    // для каждого числа возвращаем список делителей, которые будут делить это число нацело
    return numbers.filter(function(n) {
      return !(item.data.value % n);
    });
  }
});

cloud.getValues(function(item){
  console.log(item.ruleValue, item.getValues('data.value'))
});
// > 2 [2, 4, 6, 8, 10]
// > 3 [3, 6, 9]
// > 4 [4, 8]
// > 5 [5, 10]
// > 6 [6]
// > 7 [7]
// > 8 [8]
// > 9 [9]
// > 10 [10]

У каждого элемента набора есть свойство ruleValue, содержащее значение, по которому группируются объекты из набора-источника.

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

Для предыдущего примера:

var subset = cloud.getSubset(4);
console.log(subset.ruleValue, subset.getValues('data.value'));
// > 4 [4, 8]

var subset = cloud.getSubset(20);
console.log(subset);
// > null

var subset = cloud.getSubset(20, true);
console.log(subset.ruleValue, subset.getValues('data.value'));
// > 20 []

Список событий, когда должно перевычисляться правило, задается только при создании набора свойством ruleEvents. Значением этого свойства может быть строка (список событий разделенных пробелом) или массив строк. По умолчанию у элементов источника слушается событие update.