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
.