js reduce()
【摘要】 是什么ES5提供的数组的方法。reduce() 方法接收一个函数作为回调函数(accumulator),数组中的每个值(从左到右)开始缩减(其实就是从左往右开始对每个数执行回调函数),最终为一个值。PS: 回调函数的返回结果类型和传入的初始值相同 语法以及参数arr.reduce( callback(accumulator, currentValue,index ,array ) ,i...
是什么
ES5提供的数组的方法。
reduce() 方法接收一个函数作为回调函数(accumulator),数组中的每个值(从左到右)开始缩减(其实就是从左往右开始对每个数执行回调函数),最终为一个值。
PS: 回调函数的返回结果类型和传入的初始值相同
语法以及参数
arr.reduce( callback(accumulator, currentValue,index ,array ) ,initialValue )
initialValue 可选
如果有的话则作为,第一次调用 callback函数时的第一个参数的值。
如果没有提供初始值,callback则使用数组的第一个元素,作为第一次调用的初始值。
在没有初始值的空数组上调用 reduce 将报错。
accumulator
默认传入上一次调用回调函数的的返回值。
初始值: initialValue存在的话,则是initialValue 若没有则是数组的第一个元素
currentValue
数组中正在处理的元素。
index 可选
数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始。
array可选
调用reduce()的数组
一个小小的例子
例1 无initialValue
var arr = [1, 2, 3, 4, 5];
sum = arr.reduce(function(result, cur, index, arr) {
console.log(result, cur, index,arr);
return result+ cur;
})
console.log(sum) // 最后的结果是15
result | cur | index | arr | |
---|---|---|---|---|
第1次 | 1 | 2 | 1 | [1, 2, 3, 4, 5] |
第2次 | 3 | 3 | 2 | [1, 2, 3, 4, 5] |
第3次 | 6 | 4 | 3 | [1, 2, 3, 4, 5] |
第4次 | 10 | 5 | 4 | [1, 2, 3, 4, 5] |
例2 有initialValue 传入10
var arr = [1, 2, 3, 4, 5];
sum = arr.reduce(function(result, cur, index, arr) {
console.log(result, cur, index,arr);
return result+ cur;
},10)
console.log(sum) // 最后的结果是25
result | cur | index | arr | |
---|---|---|---|---|
第1次 | 10 | 1 | 0 | [1, 2, 3, 4, 5] |
第2次 | 11 | 2 | 1 | [1, 2, 3, 4, 5] |
第3次 | 13 | 3 | 2 | [1, 2, 3, 4, 5] |
第4次 | 16 | 4 | 3 | [1, 2, 3, 4, 5] |
第5次 | 20 | 5 | 4 | [1, 2, 3, 4, 5] |
回调函数的返回值
上面的例子返回的都是一个整型数字,如果希望返回其他类型的数据呢?
这个就跟accumulator的初始值有关系了。
下面的例子我们传入的是一个object {sum: 0}
var items = [0,1,2,3,4];
var reducer = function add(sumT, item) {
console.log(sumT)
sumT.sum = sumT.sum + item;
return sumT;
};
var total = items.reduce(reducer, {sum: 0});
console.log(total); // {sum:1130}
运行结果
{sum: 0}
{sum: 1}
{sum: 3}
{sum: 6}
{sum: 10}
reduce()的应用
1. 数组扁平化
递归+reduce
let arr = [1, 2, '3js', [4, 5, [6], [7, 8, [9, 10, 11], null, 'abc'], {age: 12}, [13, 14]], '[]'];
function flatten(arr) {
if(Array.isArray(arr)) {
return arr.reduce((prev, cur) => {
// 如果遍历的当前项是数组,递归调用flatten
return Array.isArray(cur) ? prev.concat(flatten(cur)) : prev.concat(cur)
}, [])
} else {
throw new Error(' 当前参数不是数组')
}
}
console.log(flatten(arr));
PS:这里的throw new Error只是用来判断一开始的arr,这是因为在递归只传入数组。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)