JavaScript重写数组中的扩展方法

92 阅读1分钟

对象深拷贝

  1. 初始版
    function deepClone(origin,target) {
        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
    }

2.优化版本*(解决对象中循环引用深拷贝死循环问题)

    function deepClone2(origin, hashMap = new WeakMap()) {
          if (origin == undefined || typeof origin !== 'object') {
            return origin
          }
          if (origin instanceof Date) {
            return new Date(origin)
          }
          if (origin instanceof RegExp) {
            return new RegExp(origin)
          }

          const hashKey = hashMap.get(origin)
          if (hashKey) {
            return hashKey
          }

          const target = new origin.constructor()
          hashMap.set(origin, target)
          for (let k in origin) {
            if (origin.hasOwnProperty(k)) {
              target[k] = deepClone(origin[k], hashMap)
            }
          }
      return target
    }

重写ForEarch


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

  for (let i = 0; i < _len; i++) {
    cb.apply(_arg2, [_arr[i], i, _arr])
  }

}

重写map

Array.prototype.myMap = function (cb) {
  var _arr = this
  var _len = _arr.length
  var _arg2 = arguments[1] || window
  var result = []
  for (let i = 0; i < _len; i++) {
    var _item = deepClone2(arr2[i])
    var _res = cb.apply(_arg2, [_item, i, _arr])
    _res && result.push(_res)
  }
  return result
}

重写filter

Array.prototype.myFilter = function (cb) {
  var _arr =this
  var _len = _arr.length
  var _arg2 = arguments[1]||window
  var result = []
  for (var i = 0; i < _len; i++) {
    var _item = deepClone2(arr2[i])
    var _res = cb.apply(_arg2, [_item, i, _arr])
    _res && result.push(_item)
  }
  return result

}

重写reduce

Array.prototype.myReduce = function (cb, initialValue) {
  var _arr = this
  var _len = _arr.length
  var _arg2 = arguments[2] || window
  var _item
  for (let i = 0; i < _len; i++) {
    _item = deepClone(_arr[i])
    initialValue = cb.apply(_arg2, [initialValue, _item, i, _arr])
  }
  return initialValue
}

重写reduceRight

Array.prototype.myReduceRight = function (cb, initialValue) {
  var _arr = this
  var _len = _arr.length
  var _arg2 = arguments[2] || window
  var _item
  for (let i = _len; i > 0; i--) {
    _item = deepClone(_arr[i])
    initialValue = cb.apply(_arg2, [initialValue, _item, i, _arr])
  }
  return initialValue
}

重写every

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

重写some

Array.prototype.mySome = function (cb) {
  var _arr =this
  var _len = _arr.length
  var _arg2 = arguments[1]||window
  var result = false

  for (var i = 0; i < _len; i++) {
    if(cb.apply(_arg2, [_arr[i], i, _arr])){
      result = true
      break
    }
  }
  return result
}