Может кто-нибудь объяснить простыми словами, как уменьшить функцию с помощью своих аргументов reduceAdd, reduceSum, reduceRemove работает в crossfilter?
Каковы функции reduceAdd, reduceSum, reduceRemove в crossfilter? Как их использовать?
Ответ 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
Ответ 2
http://blog.rusty.io/2012/09/17/crossfilter-tutorial/
var livingThings = crossfilter([
// Fact data.
{ name: "Rusty", type: "human", legs: 2 },
{ name: "Alex", type: "human", legs: 2 },
{ name: "Lassie", type: "dog", legs: 4 },
{ name: "Spot", type: "dog", legs: 4 },
{ name: "Polly", type: "bird", legs: 2 },
{ name: "Fiona", type: "plant", legs: 0 }
]);
Например, сколько живых вещей в моем доме?
Для этого хорошо назовите удобную функцию groupAll
, которая выбирает все
записи в одну группу, а затем функцию reduceCount
, которая
создает счетчик записей.
// How many living things are in my house?
var n = livingThings.groupAll().reduceCount().value();
console.log("There are " + n + " living things in my house.") // 6
Теперь давайте подсчитаем все ноги в моем доме. Опять же, используйте функцию groupAll
, чтобы получить все записи в одной группе, но затем мы вызываем
reduceSum
. Это собирается суммировать значения вместе. Какие значения?
Ну, мы хотим ноги, поэтому давайте передадим функцию, которая извлекает и возвращает количество ног из факта.
// How many total legs are in my house?
var legs = livingThings.groupAll().reduceSum(function(fact) {
return fact.legs;
}).value()
console.log("There are " + legs + " legs in my house.")
Функция reduceCount
создает счетчик записей.
Функция reduceSum
- это сумма значений этих записей.