lodash(concat)源码复写

611 阅读1分钟
function _concat() {
  var length = arguments.length,
    arg = Array(length - 1),
    array = arguments[0],
    index = length
  while (index--) {
    arg[index - 1] = arguments[index]
  }
  return arrayPush(Array.isArray(array) ? copyArray(array) : [array], baseFlatten(arg))
}

function copyArray(source, array) {
  var index = -1,
    result = [],
    length = source.length
  array || (array = Array(length))
  while (++index < length) {
    array[index] = source[index]
  }
  return array
}

function baseFlatten(array) {
  var index = -1,
    length = array.length,
    result = []
  while (++index < length) {
    var value = array[index]
    if (Array.isArray(value)) {
      arrayPush(result, value)
    } else {
      result[result.length] = value
    }
  }
  return result
}

function arrayPush(array, value) {
  var index = -1,
    arrayLength = array.length,
    valueLength = value.length
  while (++index < valueLength) {
    array[arrayLength + index] = value[index]
  }
  return array
}

console.log(_concat([1, 2], [3, 4], [[5]], [6], 9));  //[1,2,3,4,[5],6,9]

思想: 1.首先将要合并的数组重新添加到一个新数组 删除第一个参数 这里采用数组下标为-1的方式 循环的时候直接就会将他忽略 length也不会算上-1下标的值
2.然后判断需要合并数组参数第一个是否为数组 为数组则拷贝出来一份 不是 则转换为数组
3.baseFlatten函数将传进来的数组逐个传进arrayPush进行拉平一层然后插入返回 如传入的不为数组直接插入 最后返回结果数组