Ответ 1
Помните, что сокращение карты уменьшает набор данных с помощью ключей определенного измерения. Например, можно использовать экземпляр crossfilter с записями:
[
{ name: "Gates", age: 57, worth: 72000000000, gender: "m" },
{ name: "Buffet", age: 59, worth: 58000000000, gender: "m" },
{ name: "Winfrey", age: 83, worth: 2900000000, gender: "f" },
{ name: "Bloomberg", age: 71, worth: 31000000000, gender: "m" },
{ name: "Walton", age: 64, worth: 33000000000, gender: "f" },
]
и размерность, возраст, стоимость и пол. Мы уменьшим размерность пола с помощью метода сокращения.
Сначала мы определяем методы reduceAdd, reduceRemove и reduceInitial callback.
reduceInitial
возвращает объект с формой восстановленного объекта и начальными значениями. Он не принимает никаких параметров.
function reduceInitial() {
return {
worth: 0,
count: 0
};
}
reduceAdd
определяет, что происходит, когда запись "фильтруется" в восстановленный объект для определенного ключа. Первый параметр - это временный экземпляр объекта с уменьшением. Второй объект - текущая запись. Метод вернет расширенный уменьшенный переходный объект.
function reduceAdd(p, v) {
p.worth = p.worth + v.worth;
p.count = p.count + 1;
return p;
}
reduceRemove
делает противоположное от reduceAdd
(по крайней мере, в этом примере). Он принимает те же параметры, что и reduceAdd
. Это необходимо, потому что групповые сокращения обновляются, когда записи фильтруются, и иногда записи необходимо удалить из ранее вычисленной группы.
function reduceRemove(p, v) {
p.worth = p.worth - v.worth;
p.count = p.count - 1;
return p;
}
Вызов метода reduce будет выглядеть так:
mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial)
Чтобы заглянуть в уменьшенные значения, используйте метод all
. Чтобы увидеть верхние значения n, используйте метод top(n)
.
mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial).all()
Возвращенный массив должен выглядеть так:
[
{ key: "m", value: { worth: 161000000000, count: 3 } },
{ key: "f", value: { worth: 35000000000, count: 2 } },
]
Целями сокращения набора данных являются получение нового набора данных путем первой группировки записей с помощью общих ключей, а затем уменьшение размера этих группировок в одно значение для каждого ключа. В этом случае мы сгруппировали по полу и уменьшили ценность этой группы, добавив значения записей, которые разделяют один и тот же ключ.
Другие методы reduceX - методы convience для метода reduce.
Для этого примера reduceSum
будет наиболее подходящей заменой.
mycf.dimensions.gender.reduceSum(function(d) {
return d.worth;
});
Вызов all
в возвращаемой группе будет выглядеть так:
[
{ key: "m", value: 161000000000 },
{ key: "f", value: 35000000000 },
]
reduceCount
будет считать записи
mycf.dimensions.gender.reduceCount();
Вызов all
в возвращаемой группе будет выглядеть так:
[
{ key: "m", value: 3 },
{ key: "f", value: 2 },
]
Надеюсь, что это поможет:)
Источник: https://github.com/square/crossfilter/wiki/API-Reference