/* * @Author: Mr.live * @Date: 2018-01-23 14:55:22 * @Last Modified by: Mr.live * @Last Modified time: 2018-01-23 14:56:20 */ // 多维数组扁平化 var arr=[1,2,[3,4,[5,6,7]],9,[10,11]] // 1) 方法一 循环数组+递归调用 function steamroller (arr){ // 1.创建一个新数组,保存扁平后的数据 var newArr=[]; // 2.for循环原数组 for(var i=0;i<arr.length;i++){ if(Array.isArray(arr[i])){ // 如果是数组,调用steamroller 将其扁平化 // 然后在push 到newArr中 newArr.push.apply(newArr,steamroller(arr[i])) }else { // 反之 不是数组,直接push进newArr newArr.push(arr[i]) } } // 3.返回新的数组 return newArr } console.log(steamroller(arr)) // [ 1, 2, 3, 4, 5, 6, 7, 9, 10, 11 ] // 2) 方法二 利用apply+some // 利用arr.some判断当数组中还有数组的话,递归调用steamroller2扁平函数(利用apply扁平), 用concat连接,最终返回arr; function steamroller2(arr){ while(arr.some(item=> Array.isArray(item))){ arr=[].concat.apply([],arr) } return arr } console.log(steamroller2(arr)) // 3) 方法三 reduce方法 // 当数组中还有数组的话,递归调用steamroller3扁平函数(利用reduce扁平), 用concat连接,最终返回arr.reduce的返回值; function steamroller3(arr){ return arr.reduce((prev,next)=>{ return prev.concat(Array.isArray(next)?steamroller3(next):next) },[]) } console.log(steamroller3(arr)) // 4) 方法四 es6 展开运算符 // 利用arr.some判断当数组中还有数组的话,递归调用flatten扁平函数(利用es6展开运算符扁平), 用concat连接,最终返回arr; function steamroller4(arr){ while(arr.some(item=> Array.isArray(item))){ // arr=[].concat.apply([],arr) arr=[].concat(...arr) } return arr } console.log(steamroller4(arr))