手写Array.map,reduce,filter

map 具体看MDN或者我的另一篇文章

var new_array = arr.map(function callback(currentValue[, index[,array]]) {
// Return element for new_array
}[, thisArg])

以前没注意的点

  • thisArgs 指的是回调函数的this
  • thisArg 有指定时 不能用箭头函数

原因是箭头函数没有this隐式指向。箭头函数在定义时候就已经绑定了上层上下文中非箭头函数this

  • map 方法处理数组元素的范围是在 callback 方法第一次调用之前就已经确定了。调用map方法之后追加的数组元素不会被callback访问。
  • 如果存在的数组元素改变了,那么传给callback的值是map访问该元素时的值。在map函数调用后但在访问该元素前,该元素被删除的话,则无法被访问到。

手写map:

 		Array.prototype.myMap = function(callback, thisArg) {
            let arr = this;
            const result = [];
            const callbackThis = thisArg || Window.document;
            for (let i = 0; i < arr.length; i++) {
                result.push(callback.call(callbackThis, arr[i], i, arr));
            }
            return result;
        }

        let arr = [1, 2, 3];
        let arr1 = [2, 3, 4]
        console.log(arr.myMap(function(value, index, arr) {
            console.log(this); //[2,3,4]
            return value + 3
        }, arr1)); //[4,5,6]

优化一下:
对callback 进行判断

 			if (typeof(callback) !== 'function') {
                throw new TypeError(`${callback} is not functipn`)
            }

思考:
既然都写了map
那不写写reduce

array.reduce( function(total, currentValue, currentIndex, arr), initialValue)

		Array.prototype.myReduce = function(callback, initvalue) {
            let initValue = initvalue || 0
            let arr = this;
            if (typeof(callback) !== 'function') {
                throw new TypeError(`${callback} is not functipn`)
            }
            for (let i = 0; i < arr.length; i++) {
                initValue = callback.call(this, initValue, arr[i], i, arr);
            }
            return initValue;
        }

        let y = arr.myReduce((total, curvalue, index, arr) => {
            return total + curvalue;
        }, 10)
        console.log(y);//20

原理都差不多。
再来个filter吧。

        Array.prototype.myFilter = function(callback, thisArg) {
            let arr = this;
            const result = [];
            if (typeof(callback) !== 'function') {
                throw new TypeError(`${callback} is not functipn`)
            }
            const callbackThis = thisArg || Window.document;
            for (let i = 0; i < arr.length; i++) {
                if (callback.call(callbackThis, arr[i], i, arr)) {
                    result.push(arr[i])
                }
            }
            return result;
        }
        let arr = [1, 2, 3, 4];
        let arr1 = [2]
        let x = arr.myFilter(function(value, index, arr) {
            console.log(this);
            return value > 1;

        }, arr1)
        console.log(x);

要是早点学到这,某面试咋会挂呢气抖冷。。。。。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值