Skip to content

重写数组方法

深拷贝

js
// ES5
function deepClone(origin, target) {
  if (typeof origin !== 'object' || origin === null) return origin;

  var tar = target || {};
  var toStr = Object.prototype.toString;
  var arrayType = '[object Array]';

  for (var k in origin) {
    if (origin.hasOwnProperty(k)) {
      if (typeof origin[k] === 'object' && origin[k] !== null) {
        tar[k] = toStr.call(origin[k]) === arrayType ? [] : {};
        deepClone(origin[k], tar[k]);
      } else {
        tar[k] = origin[k];
      }
    }
  }
  return tar;
}

具体实现

js
Array.prototype.myForEach = function (callback) {
  var _arr = this;
  var _len = _arr.length;
  var _arg2 = arguments[1] || window;

  for (var i = 0; i < _len; i++) {
    callback.apply(_arg2, [_arr[i], i, _arr]);
  }
};
js
Array.prototype.myMap = function (callback) {
  var _arr = this;
  var _len = _arr.length;
  var _arg2 = arguments[1] || window;
  var _newArr = [];
  var _item;
  var _res;

  for (var i = 0; i < _len; i++) {
    _item = deepClone(_arr[i]);
    _res = callback.apply(_arg2, [_item, i, _arr]);
    _res && _newArr.push(_res);
  }

  return _newArr;
};
js
Array.prototype.myFilter = function (callback) {
  var _arr = this;
  var _len = _arr.length;
  var _arg2 = arguments[1] || window;
  var _newArr = [];
  var _item;

  for (var i = 0; i < _len; i++) {
    // 此处是提前做判断,若不是'object'就不调用深拷贝函数,不做也可以,深拷贝函数中已做判断
    _item =
      typeof _arr[i] === 'object' && _arr[i] !== null
        ? deepClone(_arr[i])
        : _arr[i];
    callback.apply(_arg2, [_item, i, _arr]) ? _newArr.push(_item) : '';
  }
  return _newArr;
};
js
Array.prototype.myEvery = function (callback) {
  var _arr = this;
  var _len = _arr.length;
  var _arg2 = arguments[1] || window;

  for (var i = 0; i < _len; i++) {
    if (!callback.apply(_arg2, [_arr[i], i, _arr])) {
      return false;
    }
  }
  return true;
};
js
Array.prototype.mySome = function (callback) {
  var _arr = this;
  var _len = _arr.length;
  var _arg2 = arguments[1] || window;

  for (var i = 0; i < _len; i++) {
    if (callback.apply(_arg2, [_arr[i], i, _arr])) {
      return true;
    }
  }
  return false;
};
js
Array.prototype.myReduce = function (callback, initialValue) {
  var _arr = this;
  var _len = _arr.length;
  var _arg3 = arguments[2] || window;
  var _item;

  for (var i = 0; i < _len; i++) {
    _item = deepClone(_arr[i]);
    initialValue = callback.apply(_arg3, [initialValue, _item, i, _arr]);
  }

  return initialValue;
};
js
Array.prototype.myReduceRight = function (callback, initialValue) {
  var _arr = this;
  var _len = _arr.length;
  var _arg3 = arguments[2] || window;
  var _item;

  for (var i = _len - 1; i >= 0; i--) {
    _item = deepClone(_arr[i]);
    initialValue = callback.apply(_arg3, [initialValue, _item, i, _arr]);
  }

  return initialValue;
};

Keep Reading, Keep Writing, Keep Coding