数组扁平化就是把二维三维。。。数组转化成一维普通数组。
官方提供的方法是flat
flat函数默认参数是1,可以将二维数组转化成一维数组,以此类推参数是2可以将三维数组转化成一维数组,参数为Infinity可以将任意维度的数组转化成一维数组。
console.log([1, [2, 3]].flat()); // [1, 2, 3]
console.log([1, [2, 3]].flat(1)); // [1, 2, 3]
console.log([1, [2, 3, [4, 5]]].flat()); // [1, 2, 3, [4, 5]]
console.log([1, [2, 3, [4, 5]]].flat(2)); // [1, 2, 3, 4, 5]
console.log([1, [2, 3, [4, 5]]].flat(Infinity)); // [1, 2, 3, 4, 5]
另一种实现数组扁平化的方法是concat,concat方法先拷贝调用的数组,然后将concat的参数依此push进拷贝数组里面。假如参数是数字、字符串,那么会直接push进拷贝数组,如果参数是数组,那么会先解构数组然后依此push进拷贝数组。
这里的解构你可以当做是用来去掉数组最外围的[ ]中括号的。解构的符号是...扩展运算符
var arr1 = [1, 2, 3]
var arr2 = [4, 5, 6]
// 参数是数字、字符串,所以直接push进arr1的拷贝数组。
arr1.concat(4, 'a') // [1, 2, 3, 4, 'a']
// 因为参数arr2是数组,所以会去掉arr2最外围的中括号,然后把值依次push进arr1的拷贝数组里。
arr1.concat(arr2) // [1, 2, 3, 4, 5, 6]
var arr3 = [4, [5, 6]]
// arr3是数组,所以先解构去掉最外围的中括号[ ],然后将数组元素依次push进arr1的拷贝数组。
arr1.concat(arr3) // [1, 2, 3, 4, [5, 6]]
// 这里先使用...解构数组,所以arr1.concat(...arr3)等同于arr1.concat(4, [5, 6])
// 4是数字所以直接push进arr1的拷贝数组,[5, 6]是数组所以先解构数组然后依次把5,6push进拷贝数组。
arr1.concat(...arr3) // [1, 2, 3, 4, 5, 6]
flat([1, [2, 3]]) // [1, 2, 3]
function flat(arr){
// 假如arr中存在一个元素是数组,那么循环一直执行,循环每执行一次就降低arr的一个维度。
while(arr.some(item=>Array.isArray(item))){
// 先将arr解构,这时下面的表达式等同于arr = [].concat(1, [2, 3])
// 所以1直接push进数组,[2, 3]先解构再push进数组。
arr = [].concat(...arr)
}
return arr
}