文章目录
定义和用法
reduce()方法接收一个函数
做累加器, 数组中的每个值(从左到右)开始缩减, 最后返回一个值。
reduce()方法还可以接收可选的第二个参数用做初始值
。
let arr = [1,2,3];
let cou = arr.reduce(function(total,num){
// num 是数组里的每个元素
// 最后必须写return, 每次循环都会把return的值重新赋值给total
return total+num;
});
console.log(cou); // 6
看下面这个例子来理解一下total
和num
这两个参数代表的意义。
let arr = [1,2,3];
let cou = arr.reduce(function(total,num){
// 打印输出一下看每次循环的值是多少
console.log(total,num);
// 必须return给total重新赋值, 不然total一直为0,没有意义
return total+num;
});
// 第一次循环把第一个数给total,第二个数给num
// 1 2
// 第二次循环把return的值给total, 下一个数给num
// 3 3
// 打印完之后还有一次相加所以最后结果为6
可以看到如果reduce()没有写第二个参数的话, 它会把数组的第一个元素给total
, 第二个元素给num
。
如果reduce()接收了第二个参数, 那么它会用这个参数去初始化total
。
看一下我们给reduce()传递第二个参数的效果。
let arr = [1,2,3];
arr.reduce(function(total,num){
console.log(total,num);
// 最后必须return
return total+num;
},99); // 给total初始值为99,看一下效果
// 第一次循环把初始值赋值给total, 数组的第一个元素给num
// 99 1
// 第二次循环把上一次计算结果给total,数组的下一个元素给num
// 100 2
// 第三次循环同样把上一次计算结果给total,数组的下一个元素给num
// 102 3
// 更多元素以此类推...
实例
统计每个字符出现的次数
let str = 'abcabcaab';
// 用字符串的split()方法把字符串转换成数组
let arr = str.split('');
// 定义个变量接收结果
let result = arr.reduce(function(obj,val){
// 判断这个字符是否在对象中有记录
if(val in obj){
// 如果有就让它记录次数加一
obj[val] += 1;
}else{
// 如果没有就记录并赋值为一
obj[val] = 1;
}
// 最后返回这个对象, 对其重新赋值
return obj;
},{}); // 设置初始值为一个空对象{}
console.log(result); // {a: 4, b: 3, c: 2}