共计 字 • 阅读约 min

一次面试时,被问到这个方法,没咋用过这个方法,所以没答上来.现在写一篇文章记录下这个方法的基本使用,以及进阶使用

1. 定义和用法

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

reduce() 可以作为一个高阶函数,用于函数的 compose。

2. 语法


/**
 * @param {Function} callback 为数组每一项执行该方法
 * @param {*} initialValue 初始值,作为函数第一次执行时的preveValue
 */
array.reduce(callback, initialValue)

/**
 * callback 函数接收四个参数 
 * @param {*} preveValue 上一次回调函数执行后的返回值 (必需参数)
 * @param {*} currentValue 当前遍历项 (必需参数)
 * @param {Number} currentIndex 调用reduce的array中的index (可选参数)
 * @param {Array} arr 调用reduce的array (可选参数)
 */
function callback(prevValue, currentValue, currentIndex, arr){}

使用 reduce 实现一个累加器

 function add(preveValue, currentValue){
    return preveValue + currentValue
}
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]

// 不传initialValue
arr.reduce(add)     // 45

// 传initialValue
arr.reduce(add, 10)     // 55

注意: reduce 不能使用空数组调用,除非提供了默认值

reduce 进阶用法

计算数组中每个元素出现的次数

初始值一个空对象用作 HashMap,每次调用判断当前元素是否在该 map 中,在就加 1,不在就赋值为 1

tips: Object.create(null) 可以创建一个没有原型的空对象

let arr2 = [1, 2, 3, 4, 5, 5, 5]

let res = arr2.reduce((prev, current) => {
	if (current in prev) {
		prev[current] += 1
	} else {
		prev[current] = 1
	}
	return prev
}, Object.create(null))

数组去重

let arr3 = [1, 2, 3, 4, 4, 1]
let newArr = arr3.reduce((prev, cur) => {
	if (!prev.includes(cur)) {
		return [...prev, cur]
	} else {
		return prev
	}
}, [])
console.log(newArr) // [1, 2, 3, 4]

将二维数组转化为一维

let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]

数组扁平化

多维数组,转一维数组

let arr4 = [3, 12, 1, 2, [3, 4, 4, [5, 4, 6, [8, 9, 7, 8, [9, 10, 11]]]]]
function flatArr(arr) {
    return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? flatArr(cur) : cur), [])
}
flatArr(arr4)


文章更新于: 2021-5-18 17:46:45