如何手寫實現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