Array.prototype.map 方法相信大家都用的很熟悉了，同时我也相信很多人已经自己实现了 map 函数。没有实现过自己的 map ? 没关系，我们先用 for 循环来实现下。

Array.prototype.selfMap = function () { const ary = this const result = [] const [ fn, thisArg ] = [].slice.call(arguments) if (typeof fn !== 'function') { throw new TypeError(fn + 'is not a function') } for (let i = 0; i < ary.length; i++) { result.push(fn.call(thisArg, ary[i], i, ary)) } return result } const a = new Array(1, 2, 3, 4) a.selfMap(item => item + 1) // [ 2, 3, 4, 5 ] 复制代码

[1, 2, 3].map(function(item) { console.log(this) return item }, { msg: 'mapping' }) 复制代码

{ msg: 'mapping' } 复制代码

// 这次不把方法写在Array的原型上 const reduceMap = (fn, thisArg /*真想去掉thisArg这个参数*/ ) => { return (list) => { // 不怎么愿意写下面这两个判断条件 if (typeof fn !== 'function') { throw new TypeError(fn + 'is not a function') } if (!Array.isArray(list)) { throw new TypeError('list must be a Array') } if (list.length === 0) return [] return list.reduce((acc, value, index) => { acc.push(fn.call(thisArg, value, index, list)) return acc }, []) } } // 来使用下怎么样 reduceMap(x => x + 1)([ 1, 2, 3 ]) // [ 2, 3, 4 ] const mapAry1 = reduceMap(function(item) { console.log(this) return item + 1 }, { msg: 'mapping' })([ 1, 2, 3 ]) // [ 2, 3, 4 ] // logging { msg: 'mapping' } three times 复制代码

:point_up_2:实现的原理相信大家应该都懂吧。

for 循环实现版 Array.prototype.selfFilter = function () { const ary = this const result = [] const [ fn , thisArg ] = [].slice.call(arguments) if (typeof fn !== 'function') { throw new TypeError(fn + 'is not a function') } for (let i = 0; i < ary.length; i++) { if (fn.call(thisArg, ary[i], i, ary)) { result.push(ary[i]) } } return result } const a = new Array(1, 2, 3) a.selfFilter(item => item % 2 === 0) // [ 2 ] a.selfFilter(function (item) { console.log(this) return item % 2 === 0 }) // [ 2 ] // logging {} three times 复制代码 reduce 实现版 // 同map, 不定义在Array的原型上 const reduceFilter = (fn, thisAry /* thisAry知不知你好讨厌啊 */ ) => { return (list) => { if (typeof fn !== 'function') { throw new TypeError(fn + 'is not a function') } if (!Array.isArray(list)) { throw new TypeError('list must be a Array') } if (list.length === 0) return [] return list.reduce((acc, value, index) => { fn.call(thisAry, value, index, list) ? acc.push(value) : null return acc }, []) } } reduceFilter(x => x % 2 === 0)([ 1, 2, 3 ]) // [ 2 ] 复制代码

• ### 实践才能有财富，十年结弦，一生悬命

1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责；
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性，不作出任何保证或承若；
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。