数组扁平化,就是将多维数组碾平为一维数组,方便使用。
一:例如,一个二维数组 var arr = ['a', ['b', 2], ['c', 3, 'x']],将其扁平化:
1. 通过 apply 借用数组的 concat 方法:
[].concat.apply([], arr);
结果如下:
jQuery 中的 map 方法就用到了这个技巧。
但如果直接调用 concat 方法,[].concat(arr),就没有扁平化效果。
2. 扩展运算符(...
)
[].concat(...arr)
3. reduce(ES5新增的数组方法):
[['a'], ['b', 2], ['c', 3, 'x']].reduce((a, b) => a.concat(b), []);
二:对于三维及以上的数组:
1. 数组每一项都是简单类型,如数字:
var arr = [[1], [[2, 3], [4]], 5, 6];
arr.toString().split(',').map(item => +item);
2. 递归:
1 var flatten = function(arr) { 2 var isArray = function(arr) { 3 return Array.isArray(arr) || Object.prototype.toString.call(arr) === '[object Array]'; 4 }, 5 ret = [], 6 item; 7 8 if (!isArray(arr)) { 9 return; 10 } 11 12 for (var i = 0; i < arr.length; i++) { 13 item = arr[i]; 14 if (isArray(item)) { 15 ret = ret.concat(flatten(item)); 16 } else { 17 ret.push(item); 18 } 19 } 20 21 return ret; 22 }; 23 24 flatten( [ 'a', [[[['b', 2]]]], ['c', [3, 'x']] ] );
该方法对任意维数组都有效。
三:flat (ES6方法)
flat(Infinity) 可将任意维数组转成一维数组