例如,这是一个返回行的总和和长度的函数:
function(key, values, rereduce) {
var result = {total: 0, count: 0};
for(i=0; i < values.length; i++) {
if(rereduce) {
result.total = result.total + values[i].total;
result.count = result.count + values[i].count;
} else {
result.total = sum(values);
result.count = values.length;
}
}
return(result);
}
看起来你必须定义:
为什么这么奇怪?传统方法可以简单描述为:
reduce = {
op: function(accumulated,val){
return {total:accumulated.total + val, count:accumulated.count++};
},
initial: {total:0, count:0}
}
其中包含足够的信息来减少整个数组并为新值更新它......!
答案 0 :(得分:2)
reduce
阶段是重复的,因为它使存储/缓存更容易。您应该将reduce函数的结果想象为树。要减少某个连续的节点子集,您可以在很大程度上使用预先计算的减少值(以及一些原始的减少值),这样您就不必下降整个树/重新计算其中所有节点的值。查询范围。
我希望稍微澄清一下,这有点难以解释。