你知道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) })
如果重寫其他數組的方法思路,想想內置的方法如何調用,根據調用方法一步一步推倒