有人可以简单地解释一下 reduce 函数及其参数reduceAdd
, reduceSum
,是如何reduceRemove
工作的crossfilter
吗?
2 回答
请记住,map reduce 通过特定维度的键来减少数据集。例如,让我们使用带有记录的交叉过滤器实例:
[
{ 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" },
]
和维度名称、年龄、价值和性别。我们将使用reduce方法减少性别维度。
首先我们定义了reduceAdd、reduceRemove 和reduceInitial 回调方法。
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 方法是 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
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
函数是这些记录的总和值。