有人可以简单地解释一下,使用其参数reduceAddreduceSumreduceRemove的reduce函数在crossfilter中如何工作吗?

最佳答案

请记住,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定义了将记录“过滤”到特定键的简化对象中时发生的情况。第一个参数是简化对象的 transient 实例。第二个对象是当前记录。该方法将返回增强的 transient 简化对象。
function reduceAdd(p, v) {
    p.worth = p.worth + v.worth;
    p.count = p.count + 1;
    return p;
}
reduceRemovereduceAdd相反(至少在此示例中)。它采用与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 } },
]

减少数据集的目的是首先通过按公用键对记录进行分组,然后将这些分组的维数减小为每个键的单个值,从而得出新的数据集。在这种情况下,我们按性别分组并通过添加共享相同键的记录的值来减少该分组的值(value)维度。

其他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

07-24 17:34