[1, [2, 3], [[3, 4, 2], 1], 5, [3]] => [1, 2, 3, 3, 4, 2, 1, 5, 3]
[1, ['2', 3], [2], '2', 4] => [1, "2", 3, 2, "2", 4]
-
遞歸
循環(huán)數(shù)組镶摘,判斷 arr[i] 是否是數(shù)組跑芳,是數(shù)組的話再次調(diào)用此函數(shù)蝇完。const flatten = (arr) => { let res = [] arr.forEach(item => { if (Array.isArray(item)) { res = res.concat(flatten(item)) } else { res.push(item) } }) return res }
-
reduce() 方法
reduce() 接收一個(gè)函數(shù)作為累加器,數(shù)組中的每個(gè)值(從左到右)開始縮減割卖,最終計(jì)算為一個(gè)值壁畸。
語法:array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
贼急,接收四個(gè)參數(shù),前兩個(gè)必填捏萍,total 初始值太抓,計(jì)算結(jié)束后的返回值;currentValue 當(dāng)前元素令杈;currentIndex 當(dāng)前元素索引走敌;arr 元素所屬數(shù)組對象;initialValue逗噩,累加器初始值掉丽。// 求數(shù)組的各項(xiàng)值相加的和 arr.reduce((total, item)=> total + item, 0)
const flatten = (arr) => { return arr.reduce((pre, next) => { return pre.concat(Array.isArray(next) ? flatten(next) : next); }, []) }
-
toString & split
調(diào)用數(shù)組的toString方法,將數(shù)組變?yōu)樽址缓笤儆胹plit分割還原為數(shù)組异雁,但是此方法會改變數(shù)據(jù)類型捶障。慎用!8俚丁项炼!// split之后是字符串 再轉(zhuǎn)一下數(shù)字 const flatten = (arr) => arr.toString().split(',').map(item => +item)
-
ES6 flat()
flat(n)將每一項(xiàng)的數(shù)組偏平化,n默認(rèn)是1,表示扁平化深度锭部,Infinity無限次暂论,flat() 會跳過空格,返回新數(shù)組不改變原數(shù)組拌禾。const flatten = (arr) => arr.flat(Infinity)
-
ES6 擴(kuò)展運(yùn)算符 ...
es6的擴(kuò)展運(yùn)算符能將二維數(shù)組變?yōu)橐痪S取胎,故仍需遍歷。const flatten = (arr) => { while (arr.some(item => Array.isArray(item))) { arr = [].concat(...arr) // 給原數(shù)組重新賦值 } return arr }