2

例如,这是一个返回行的总和和长度的函数:

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}
}

其中包含足够的信息来减少整个数组并更新它以获得新值......!

4

1 回答 1

2

reduce阶段是重复的,因为它使存储/缓存更容易。你应该把reduce函数的结果想象成一棵树。要减少某个连续的节点子集,您可以在很大程度上使用预先计算的减少值(以及一些原始值),这样您就不必下降整个树/重新计算所有节点的值查询范围。

我希望这能澄清一点,这有点难以解释。

于 2013-03-29T13:43:27.453 回答