reduce 语法
1 | arr.reduce(callback[, initialValue]) |
- callback 表示执行数组中每个值的函数,包含四个参数:
- previous 上次调用回调返回的值,或者是提供的初始值(initialValue)
- currentValue 数组中当前被处理的元素
- index 当前元素在数组中的索引
- array 调用 reduce 的数组
- initialValue 作为第一次调用 callback 的第一个参数
简单应用
1 | var items = [25, 175, 2500]; |
reduce 函数初始值为0,不断累加,完成数据求和。同理,初始值也可以是对象类型。
1 | var items = [25, 175, 2500]; |
进阶应用
下面就是 manager 函数的实现,它需要 reducers 对象作为参数,并返回一个 callback 类型的函数,作为 reduce 的第一个参数。在该函数内部,则执行多维的叠加工作(Object.keys())。
通过这种分治的思想,可以完成目标对象多个属性的同时叠加,完整代码如下:
1 | var reducers = { |
举个例子
某同学考试成绩如下:
1 | var result = [ |
利用 reduce 求总成绩
1 | var sum = result.reduce(function(prev, cur) { |
下面增加点难度,假如该同学总成绩中各科比重所占不同,分别为50%,30%,20%,如何求出最终权重结果?
1 | var weight = { |
利用 reduce 求一串字符串每个字母出现次数
1 | var arrString = 'abcdaabc'; |
其他用法,各种各样的类型转换,比如将数组按照一定规则转换为对象:
一种形式数组转换为另一种形式数组:
1
2
3
4
5
6
7
8
9
10[4, 6].reduce(function(res, cur) {
res.push(cur + 1);
return res;
}, []); // [5, 7]
[4, 6].reduce(function(res, cur) {
res.a = res.a + cur;
res.b = res.b + cur;
return res;
}, {a: 0, b: 0}); // {a: 10, b: 10}koa源码中有个 only 模块,整个模块就一个简单的返回 reduce 方法操作的对象
1
2
3
4
5
6
7
8
9var only = function(obj, keys){
obj = obj || {};
if ('string' == typeof keys) keys = keys.split(/ +/);
return keys.reduce(function(ret, key){
if (null == obj[key]) return ret;
ret[key] = obj[key];
return ret;
}, {});
};通过对 reduce 概念的理解,这个模块主要是想新建并返回一个 obj 对象中存在的 keys 的 object 对象。
1
2
3
4
5
6var a = {
env : 'production',
proxy : true,
subdomainOffset : 5
}
only(a,['env','proxy']) // {env:'production',proxy : true}