今天看到一个话题讨论JavaScript数组扁平化,忍不住自己也实现一下,在下采用的方式和别人不同,talk is cheap,show you the code!
法一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function flattenArray (arr ) { if (arr && Array .isArray(arr)) { return arr.reduce((acc, cur ) => { acc = acc.concat(cur) for (let item of acc) { if (item && item instanceof Array ) { return arguments .callee(acc) } } return acc }, []) } }
法二: 1 2 3 4 5 6 function flattenArr (arr ) { while (arr.some(item => Array .isArray(item))) { arr = [].concat(...arr) } return arr }
法三:递归 1 2 3 4 5 6 7 8 9 function flatten (arr ) { let res = [] for (let i = 0 ; i < arr.length; i++) { if (arr[i] instanceof Array ) { res = res.concat(flatten(arr[i])) } else res.push(arr[i]) } return res }
法四:reduce递归 1 2 3 4 5 function flatten (arr ) { arr.reduce((prev, val ) => { return prev.concat(Array .isArray(val) ? flatten(val) : val) }, []) }
法五:JSON.stringify / JSON.parse(结合正则替换) 1 2 3 4 5 6 function flatten (arr ) { let str = JSON .stringify(arr) str = str.replace(/\[|\]/g , '' ) return JSON .parse('[' + str + ']' ) }
这可以解决任何多维数组的扁平化,比如,我们实验一下:
1 2 3 let arr = [1 , [2 ,11 ], [3 ,[4 ,5 ]],[6 ,[7 , [8 ,[9 ]]]]] let c = flattenArray(arr) console .log(c)
输出,如下:
如此,我们就解决了数组扁平化操作。如有不当之处,希望批评指教!在此谢过!