Array 内置方法手写

364 阅读1分钟

join()

用于把数组中的所有元素放入一个字符串。

元素是通过指定的分隔符进行分隔的。

Array.prototype._join = function ()
{
  const separator = arguments[0] === void 0 ? "," : arguments[0]
  var _this = this
  var result = ""
  for (var i = 0, len = _this.length; i < len; i++)
  {
    result += i + 1 === len ? _this[i] : _this[i] + separator
  }
  return result
}

slice(start, end)

Array.prototype._slice = function ()
{
  var _this = this
  var len = _this.length
  var [_start, _end] = arguments
   _start = _start !== void 0 ? _start < 0 ? _this.length - Math.abs(_start) : _start : 0
   _end = _end !== void "" ? _end < 0 ? _this.length - Math.abs(_end) : _end : len
  var result = []
  for ( var i = _start; i < _end; i++ )
  {
    Array.prototype.push.call(result, _this[i])
  }
  return result
}

map(callback)

Array.prototype._map = function ()
{
  var [handle, ...rest] = arguments
  var result = []
  try {
    for (var i = 0, len = this.length; i < len; i++)
    {
      result[i] = handle(this[i], i, this)
    }
  }
  catch (error) {
    throw new Error(error)
  }
  finally {
    return result
  }
}

filter(callback)

Array.prototype._filter = function ()
{
  var [handle, ...rest] = arguments
  var result = []
  try {
    for (var i = 0,len = this.length; i < len; i++)
    {
      typeof handle === "function" ?
      handle(this[i], i, this) && (result[result.length] = this[i]) :
      this[i] instanceof handle && (result[result.length] = this[i])
    }
  }
  catch (error) {
    throw new Error(error)
  }
  finally {
    return result
  }
}

reduce(callback, initial)

Array.prototype._reduce = function ()
{
  var [handle, ...rest] = arguments
  var initial = rest.length ? rest[0] : this[0]
  try {
    for (var i = rest.length ? 0 : 1, len = this.length; i < len; i++) {
      initial = handle(initial, this[i], i, this)
    }
  }
  catch (error) {
    throw new Error(error)
  }
  finally {
    return initial
  }
}

concat

用于连接两个或多个数组。

该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

Array.prototype._concat = function ()
{
  var args = arguments
  var result = Array.prototype.slice.call(this)
  var len = result.length
  var _index = 0
  for (var i = 0; i < args.length; i++ )
  {
    if (args[i] instanceof Array)
    {
      let _len = args[i].length
      for (var s = 0; s < _len; s++)
      {
        result[len + s + _index + i] = args[i][s]
      }
      _index = _index + _len - 1
    }
    else
    {
      result[len + _index + i] = args[i]
    }
  }
  return result
}

reverse

逆向排列数组

Array.prototype._reverse = function () {
    let _this = Array.prototype.slice.call(this) || []
    let _result = []
    for (var _len = _this.length - 1;_len >= 0; _len--) {
      Array.prototype.push.call(_result, _this[_len])
    }
    return _result
}