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进行拉平一层然后插入返回 如传入的不为数组直接插入 最后返回结果数组