如何手写实现reduce方法以及reduce的高逼格用法


你知道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)
})

 

如果重写其他数组的方法思路,想想内置的方法如何调用,根据调用方法一步一步推倒


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM