underscorejs reduce
如何运作?
这很简单
_.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);
(结果为6
)。
但其他可选参数如何工作?在文档中它说:
备注是减少的初始状态,它的每个连续步骤都应该由迭代器返回。迭代器传递四个参数:备忘录,然后是迭代的值和索引(或键),最后是对整个列表的引用。“
但我不明白。我尝试使用reduce
来解决以下问题,我无法弄清楚:
var input = [{"score": 2, "name": "Jon", "venue": "A"}, {"score": 3, "name": "Jeff", "venue":"A"}, {"score": 4, "name": "Jon", "venue":"B"}, {"score": 4, "name": "Jeff", "venue":"B"}];
var output = [{"score": 6, "name":"Jon", "venue": ["A", "B"]}, {"score": 7, "name":"Jeff", "venue": ["A", "B"]}];
如何使用_reduce
输入作为输出?它将如何在reduce内部工作真的很有帮助。
答案 0 :(得分:10)
Reduce获取值列表,并将其减少为单个值。你正在尝试的不只是减少。您正尝试首先分组(按名称),然后减少每个组。一个可能的实现是这样的,你首先分组,然后将每个组映射到一个reduce操作,累积分数并附加到场地。
var input = [
{"score": 2, "name": "Jon", "venue": "A"},
{"score": 3, "name": "Jeff", "venue":"A"},
{"score": 4, "name": "Jon", "venue":"B"},
{"score": 4, "name": "Jeff", "venue":"B"}];
var output = _.map(_.groupBy(input, "name"), function(group, name) {
return _.reduce(group, function(memo, elem) {
memo.score += elem.score;
memo.venue.push(elem.venue);
return memo;
},
{ name: name, score: 0, venue: [] });
});
答案 1 :(得分:2)
而不是reduce
,请尝试以这种方式使用简单each
:
_.each
承认上下文的第三个参数。所以,例如:
var input = ["Alice", "Bob", "Charlie"];
var context = {};
_.each(input, function(o,i) { this[i] = o; }, context);
console.log(context) //=> {1: "Alice", 2: "Bob", 3: "Charlie"}
Ruby有一个新方法调用each_with_object
类似于reduce的精确模式,其中memo不一定是值返回(实际上,我的函数没有返回任何东西!);但下划线简化了其API设计,只是将该函数的上下文作为第三个参数。
你可以使用reduce,但你需要每次都返回备忘录,使它更不优雅恕我直言。