我是瘦子

Js 数组扁平化

问题:[[0, 1], [2, 3], [4, 5]] -> [0, 1, 2, 3, 4, 5]?

方法一

利用 es5arr.reduce(callback[, initialValue]) 实现

1
2
3
let arr1 = [[0, 1], [2, 3], [4, 5]];
let arr2 = arr1.reduce( (a, b) => a.concat(b) );
// arr2 [0, 1, 2, 3, 4, 5]

方法二

多维数组

1
2
3
4
let arr = [[1,2],3,[[[4], 5]]]
let flatten = (arr) => [].concat( ...arr.map(x => Array.isArray(x) ? flatten(x) : x) )
let arr2 = flatten(arr);
console.log(arr2) // arr2 [1, 2, 3, 4, 5]

方法三

利用 apply 实现

1
2
3
let arr1 = [[0, 1], [2, 3], [4, 5]];
let arr2 = [].concat.apply([], arr1);
console.log(arr2); // arr2 [0, 1, 2, 3, 4, 5]

方法四

利用 ES 的最新语法,Array.prototype.flat()。缺点是,有兼容性问题。优点是非常简单。
flat() 方法会按照一个可指定的深度递归遍历数组(默认值为1),并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let arr1 = [1, 2, [3, 4]];
let arr2 = arr1.flat(); // arr2 [1, 2, 3, 4]

let arr3 = [1, 2, [3, 4, [5, 6]]];
let arr4 = arr3.flat(); // arr4 [1, 2, 3, 4, [5, 6]]

let arr5 = [1, 2, [3, 4, [5, 6]]];
let arr6 = arr5.flat(2); // arr6 [1, 2, 3, 4, 5, 6]

// 使用 Infinity,可展开任意深度的嵌套数组
let arrInfinity = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
let arr7 = arrInfinity.flat(Infinity); // arr7 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// flat() 方法会移除数组中的空项,但 undefined、null 仍会保留
let arr8 = [1, 2, , 4, 5];
let arr9 = arr8.flat(); // arr9 [1, 2, 4, 5]