你知道reduce如何实现的吗?今天一点一点重写reduce方法,要知道如何实现前提知道如何调用,一个简单地求和方法
var arr = [1,2,3] arr.reduce((prev, item) => prev + item, 10)
暂时先不考虑第二个参数,重写数组原型上的reduce方法
Array.prototype.reduce = function(fn) { var arr = this //this就是调用reduce方法的数组 var total = arr[0] // 默认为数组的第一项 for (var i = 1; i < arr.length; i++) { total = fn(total, arr[i], i , arr) } return total } var arr = [1,2,3] console.log(arr.reduce((prev, item) => prev + item))
reduce方法有第二个参数是初始值,优化后的代码如下
Array.prototype.reduce = function(fn, init) { var arr = this // this就是调用reduce方法的数组 var total = init || arr[0] // 有初始值使用初始值 // 有初始值的话从0遍历, 否则从1遍历 for (var i = init ? 0 : 1; i < arr.length; i++) { total = fn(total, arr[i], i , arr) } return total } var arr = [1,2,3] console.log(arr.reduce((prev, item) => prev + item, 10))
那reduce有哪些高逼格的用法呢
1.去重
var arr = [1,2,3,4,1,2,3,4] arr.reduce((prev, item) => { !prev.includes(item) && prev.push(item) return prev }, [])
2,找到数组中重复次数最多的值
var arr = ['a','b','c','a','d','e','r','a'] arr.reduce((prev, item) => {
prev[item]++ || (prev[item] = 1)
return prev
}, {})
3.将二维数组转化为一维
var arr = [[1,2], 3, [4,5]] arr.reduce((prev, item) => { if (Array.isArray(item)) { prev = prev.concat(item) } else { prev.push(item) } return prev }, [])
4.求数组中的最大最小值
var arr = [1,2,3,4,5,6,7,8,9] arr.reduce((prev, item) => { return Math.max(prev, item) // 最小值 // return Math.min(prev, item) })
如果重写其他数组的方法思路,想想内置的方法如何调用,根据调用方法一步一步推倒