js怎么实现Array的reduce函数?

思维不行,求指点?

阅读 4.8k
4 个回答
if (!Array.prototype.reduce) {
  Array.prototype.reduce = function(callback /*, initialValue*/) {
    'use strict';
    if (this === null) {
      throw new TypeError('Array.prototype.reduce called on null or undefined');
    }
    if (typeof callback !== 'function') {
      throw new TypeError(callback + ' is not a function');
    }
    var t = Object(this), len = t.length >>> 0, k = 0, value;
    if (arguments.length == 2) {
      value = arguments[1];
    } else {
      while (k < len && !(k in t)) {
        k++; 
      }
      if (k >= len) {
        throw new TypeError('Reduce of empty array with no initial value');
      }
      value = t[k++];
    }
    for (; k < len; k++) {
      if (k in t) {
        value = callback(value, t[k], k, t);
      }
    }
    return value;
  };
}

来源

function reduce(array, iteratee, init, context) {
    
    if (array == null) array = [];
    if (toString.call(array) !== '[object Array]') throw new TypeError(array + ' is not a array');

    if (iteratee == null) return array;
    if (typeof iteratee !== "function") throw new TypeError(iteratee + ' is not a function');

    var len = array.length, i = 0;

    //把iteratee绑定到context对象上
    iteratee = (function(func, context) {
        
        if (context === undefined) return func;

        return function(init, value, index, collection) {
          return  func.call(context, init, value, index, collection)
        }

    })(iteratee, context);
    
    //若不传初始值init,则规定第一个为初始值 
    if (arguments.length < 3) {
        init = array[i++]
    }
    for (; i < len; i++) {
        init = iteratee(init, array[i], i, array)
    }

    return init

}

一般调用:

reduce([1, 2, 3], function(init, value) {
    return init + value //自定义一个加法规则
}, 1)
// 7

绑定到对象:

var myMath = {
   name:"myMath",
   add:function(a,b){
    return a+b
   }
}

reduce([1, 2, 3], function(init, value) {
    //绑定了对象myMath,this就指向myMath,就可以调用其方法或获取其属性值
    return  this.add(init,value)
}, 1, myMath);
// 7

遍历叠加呀。。。

已经赞赏2元,不知道你能不能收得到。思维不错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏