concat
方法创建一个新的数组
-
Array.prototype.concat.call([], …arr)
-
Array.prototype.concat.apply([], arr)
-
[].concat()
该数组由被调用数组
和参数元素
组成。
如果参数是数组
,而数组本身的元素中也包含数组,则元素数组不会被递归展开
。
let arr = [1,2,[3,4],5,6]
let arr3 = [].concat(arr) // [1, 2, Array(2), 5, 6]
let arr3 = [].concat(1,2,[3,4],5,6) // [1,2,3,4,5,6]
如果参数是对象
,那么新数组中的元素只是参数对象的浅拷贝
。
let arr = [1,2,{a:3}]
let arr1 = [].concat(arr)
arr[2].a = 5
arr1 // [1,2,{a:5}]
如果参数是字符串、数字或布尔值
,则该方法将这些值复制
到新数组中。
[].concat(3,‘abc’, true) // [3, ‘abc’, true]
所以这里我们使用递归来实现深层数组的拍平
function flat(arr) {
// 判断数组元素中是否还有数组类型项
const isDeep = arr.some(item => item instanceof Array)
// 没有直接返回当前数组,结束递归
if(!isDeep) {
return arr
}
// 每次都把当前层数组拍平
const res = Array.prototype.concat.apply([], arr)
return flat(res)
// return falt(res.sort((a, b) => a-b)) // 如果要进行排序操作
}