今天看到一篇文章是处理数组扁平化的三种方式,试了一下,发现了一些特殊情况,特此记录
一、 递归方式
var arr1 = [1, 2, [33, 44], [55, [666, 777]]]
var arr2 = []
function arrFun(arr) {
for (let i = 0; i < arr.length; i++) {
if (arr[i].length && arr[i].length > 1) {
arrFun(arr[i])
} else {
arr2.push(arr[i])
}
}
}
arrFun(arr1)
console.log(arr2, 'arr2') // [1, 2, 33, 44, 55, 666, 777] 'arr2'
如果处理 [1, 2, [33, 44], [55, [666, 777]]],这种数组是可以的,但是以下两种情况是不能达到期望的
当我们使用 arr[i].length > 1 时,分两种情况
(1)arr1中是否含有 只有一个元素的数组
var arr1 = [[8], 1, 2, [33, 44], [55, [666, 777]]]
注意arr1中是否含有 只有一个元素的数组,例如 [8],这种情况下,arr[i].length也是等于1的,所以会直接将 [8]放入arr2中,结果:
[[8], 1, 2, 33, 44, 55, 666, 777] 'arr2'
(2)arr1中是否有元素含有length > 1 的字符串
var arr1 = [ '88888', 1, 2, [33, 44], [55, [666, 777]]]
注意:arr1中是否有元素含有length > 1 的字符串,例如:‘88888’ 这种情况下,会将该字符串拆解,结果:
['8', '8', '8', '8', '8', 1, 2, 33, 44, 55, 666, 777] 'arr2'
二、使用toString()
使用toString会将数组转化为字符串,先看代码:
var arr1 = [1, 2, [33, 44], [55, [666, 777]]]
var arr2 = arr1.toString()
console.log(arr2, 'arr2') // 1,2,33,44,55,666,777 arr2
我们将转化结果放进数组中, 可以发现,这些元素都已经变成了字符串类型
var arr1 = [1, 2, [33, 44], [55, [666, 777]]]
var arr2 = arr1.toString().split(',')
console.log(arr2, 'arr2') // ['1', '2', '33', '44', '55', '666', '777'] 'arr2'
三、使用flat(推荐)
flat(index),参数index表示要拉平的层数,默认一层
flat() 默认情况下:
var arr1 = [1, 2, [33, 44], [55, [666, 777]]]
var arr2 = arr1.flat()
console.log(arr2, 'arr2') // [1, 2, 33, 44, 55, [666, 777]]
flat(1):
var arr1 = [1, 2, [33, 44], [55, [666, 777]]]
var arr2 = arr1.flat(2)
console.log(arr2, 'arr2') // [1, 2, 33, 44, 55, 666, 777] 'arr2'