本文详细解析 JavaScript 数组 reduce 方法的语法结构与四个核心参数,并通过求和、词频统计、扁平化、去重及最大值查找等具体代码示例,展示其在日常开发中的多种应用。此外,还介绍了利用 reduce 实现 Promise 串行调用的技巧,帮助开发者写出更优雅、简洁的代码。
前言
在实际开发中,计算与循环逻辑处理极为常见。巧妙运用数组的 reduce 方法,能够解决诸多复杂问题,从而显著提升代码的优雅程度与可读性。
reduce语法
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
参数说明
reducer 函数需要接收 4 个参数分别是
callback
- Accumulator
- 累计器,用于累积回调函数的返回值;它是上一次调用回调时返回的累积值,或者提供的 initial Value。
- Current Value
- 数组中正在处理的当前元素。
- Current Index
- 这是一个可选参数,表示当前正在处理的数组元素的索引。如果提供了 initial Value,则起始索引为 0;否则从索引 1 开始。
- Source Array
- 这是一个可选参数,指调用 reduce() 方法的原始数组。
initialValue
- 作为第一次调用 callback 函数时 accumulator 参数的初始值。如果没有提供初始值,则将使用数组中的第一个元素。需要注意的是,在没有初始值的空数组上调用 reduce 将直接报错。
返回值
- 函数累计处理后的最终结果。
一些reduce常用方法
数组里所有元素的和
const arr = [1, 2, 3, 4];
const result = arr.reduce((acc, cur) => acc + cur)
console.log(result) // 10
计算数组中每个元素出现的次数
const nums = ['1', '1', '1', '2', '3'];
const countednums = nums.reduce((acc, cur) => {
if (cur in acc) {
acc[cur]++;
}
else {
acc[cur] = 1;
}
return acc;
}, {});
console.log(countednums); // {1: 3, 2: 1, 3: 1}
扁平化数组
const arr = [['a', 'b'], ['b', 'c'], ['d', 'e']]
const flatten = arr => {
return arr.reduce((acc, cur) => {
return acc.concat(cur)
}, [])
}
console.log(flatten(arr)); // ["a", "b", "b", "c", "d", "e"]
数组去重
const arr = [22,341,124,54,4,21,4,4,1,4,4];
const result = arr.sort().reduce((acc, cur) => {
if(acc.length === 0 || acc[acc.length-1] !== cur) {
acc.push(cur);
}
return acc;
}, []);
console.log(result); // [1, 124, 21, 22, 341, 4, 54]
求数组中最大值
const arr = [1, 2, 3, 5, 1]
let result = arr.reduce((acc, cur) => Math.max(acc, cur))
console.log(result)
按照顺序调用promise
这种方式实际上处理的是 promise 的 value,将上一个 promise 的 value 作为下一个 promise 的 value 进行处理。
const prom1 = a => {
return new Promise((resolve => {
resolve(a)
}))
}
const prom2 = a => {
return new Promise((resolve => {
resolve(a * 2)
}))
}
const prom3 = a => {
return new Promise((resolve => {
resolve(a * 3)
}))
}
const arr = [prom1, prom2, prom3]
const result = arr.reduce((all, current) => {
return all.then(current)
}, Promise.resolve(10))
result.then(res => {
console.log(res);
})
最后
本文分享了一些在日常开发中比较常用的一些 reduce 处理方法,你可以直接拿到你的项目中使用,也可以进行二次封装。
到此这篇关于js利用reduce方法让你的代码更加优雅的文章就介绍到这了,更多相关js reduce方法让代码优雅内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!