数组扁平化/数组拉平
方法一:
用ECMAscript 2019 中的flat方法
var arr=[1,[2,3],[4,5],[6,[7,8],9,[[[10,[[11,12],13],14],15,16],17],18]];
arr.flat(Infinity); //参数为层数,默认一层
注意:flat和flatMap方法为ES2019(ES10)方法,目前还未在所有浏览器完全兼容。
方法二:
利用arr.toString(),将数组转换为字符串
再利用str.split(‘ ,’),将字符串转换为新的数组
var arr=[1,[2,3],[4,5],[6,[7,8],9,[[[10,[[11,12],13],14],15,16],17],18]];
var str=arr.toString(); //转换为字符串
var arr2=str.split(','); //转回数组
for(var i=0;i<arr2.length;i++){ //将新数组的每一项转换为整型,与原数组保持一致
arr2[i]=parseInt(arr2[i]);
}
console.log(arr2);
方法三:
concat+apply实现
var arr=[1,[2,3],[4,5],[6,[7,8],9,[[[10,[[11,12],13],14],15,16],17],18]];
function fun(arr){
while(arr.some(item => Array.isArray(item))){ //判断数组的每一个元素是否是数组
arr = [].concat.apply([],arr);
}
return arr;
}
console.log(fun(arr));
说明:
1.实质是利用递归和数组合并方法concat实现扁平。
2.some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。详细描述
3.apply方法会调用一个函数,apply方法的第一个参数会作为被调用函数的this值,apply方法的第二个参数(一个数组,或类数组的对象)会作为被调用对象的arguments值,也就是说该数组的各个元素将会依次成为被调用函数的各个参数;arr作为apply方法的第二个参数,本身是一个数组,数组中的每一个元素(还是数组,即二维数组的第二维)会被作为参数依次传入到concat中,效果等同于[].concat(1, 2, 3, [4, 5, 6], 7, 8, [9, 10])。利用apply方法,我们将单重循环优化为了一行代码