数组扁平化

1
const arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

有这么一个数组,要对该数组进行扁平化操作,自己总结了以下几个方法:

  1. 数组的原生方法
1
arr.flat(Inifity); // Inifity 可以扁平化任意嵌套层数的数组

该方法虽然非常简洁,但是浏览器兼容性很差。

  1. 递归
1
2
3
4
5
6
7
8
9
10
11
function flat(arr) {
let flattenArr = [];
arr.forEach(item => {
if (Array.isArray(item)) {
flattenArr = flattenArr.concat(flat(item))
} else {
flattenArr.push(item);
}
})
return flattenArr;
}
  1. 非递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function flat(arr) {
const flattenArr = [];
for(let i = 0;i<arr.length;i++) {
const stack = [];
if (Array.isArray(arr[i])) {
stack.push(arr[i]);
} else {
flattenArr.push(arr[i]);
}
while(stack.length) {
const newArr = stack.pop();
for(let i = 0;i<newArr.length;i++) {
if (Array.isArray(newArr[i])) {
stack.push(newArr[i]);
} else {
flattenArr.push(newArr[i]);
}
}
}
}
return flattenArr;
}
  1. 擦边球方法

因为数组中的元素比较特殊,都是 Number 类型, 所以可以使用以下方法。

1
2
arr.join(',').split(',').map(Number);
arr.toString().split(',').map(Number);

如果都是 Boolean 类型,如:

1
const arr = [ true, [false, true, [false, true] ] ];

则可以扁平化如下:

1
2
arr.join(',').split(',').map(JSON.parse);
arr.toString().split(',').map(JSON.parse);

注:不适用于对象等复杂类型的对象


image.png