利用 ES 的最新语法, Array.prototype.flat(). 缺点是, 有兼容性问题. 优点是非常简单.
flat() 方法会递归到指定深度将所有子数组连接, 并返回一个新数组
语法: var newArray = arr.flat(depth), 参数说明: depth, 可选, 指定嵌套数组中的结构深度, 默认值为 1
- var arr1 = [1, 2, [3, 4]];
- arr1.flat(); // [1, 2, 3, 4]
- var arr2 = [1, 2, [3, 4, [5, 6]]];
- arr2.flat(); // [1, 2, 3, 4, [5, 6]]
- var arr3 = [1, 2, [3, 4, [5, 6]]];
- arr3.flat(2); // [1, 2, 3, 4, 5, 6]
- //Infinity 展开所有嵌套数组
- arr3.flat(Infinity); // [1, 2, 3, 4, 5, 6]
- var arr4 = [1, 2, , 4, 5];
- arr4.flat(); // [1, 2, 4, 5]
特殊说明: flat() 方法会移除数组中的空项. 但 undefined,null 仍会保留.
- var arr = [1, 2, undefined , 4, 5, null];
- arr.flat(); // [1, 2, undefined , 4, 5, null]
利用 apply 实现
- var arr1 = [[0, 1], [2, 3], [4, 5]];
- var arr2 = [].concat.apply([], arr1);
- // arr2 [0, 1, 2, 3, 4, 5]
利用 es6
- var arr1 = [[0, 1], [2, 3], [4, 5]];
- function flatten(arr) {
- return [].concat( ...arr.map(x => Array.isArray(x) ? flatten(x) : x) )
- }
- var arr2 = flatten(arr1); // arr2 [0, 1, 2, 3, 4, 5]
- // 优点: 多维数组也可以
- // 比如: var arr = [[1,2],3,[[[4], 5]]]
利用 es5 的 arr.reduce(callback[, initialValue]) 实现
- var arr1 = [[0, 1], [2, 3], [4, 5]];
- var arr2 = arr1.reduce(function (a, b) {
- return a.concat(b)
- } );
- // arr2 [0, 1, 2, 3, 4, 5]
通过将数组转变成字符串, 利用 str.split(',') 实现. 缺点是数组元素都变字符串了
- var arr1 = [[0, 1], [2, 3], [4, 5]];
- var arr2 = (arr1 + '').split(',');
- var arr2 = arr.toString().split(',');
- var arr2 = arr.join().split(',');
- // arr2 ["0", "1", "2", "3", "4", "5"]
来源: http://www.bubuko.com/infodetail-3384653.html