假设有这样一个数组,数组内部嵌套了两层甚至更多数组
let arr = [1, 2, [3, 4, [6, 7]]]
在我们面对复杂的逻辑问题时,可能需要遍历该数组中所有的元素,包括嵌套数组内的各个元素。
这样的话我们在遍历数组时还需要判断是否还有嵌套的数组,这难免会对性能有所影响。所以我们可以将所有的元素都放在同一层次上,即数组内没有嵌套数组
let arr = [1, 2, 3, 4, 6, 7]
看到这样的需求,你能想到多少种方法来实现呢?那么就让我来给你讲解四种常用的方式吧~
1
第一种方式可以直接使用ES6提供的新函数 flat( )
function flatArr1(arr) { return arr.flat(Infinity)}
2
第二种方式可以使用正则,将除了两端的 [ ] 符号,将其它所有内部嵌套函数的 [ ] 符号给去掉,即可实现数组扁平化的需求
function flatArr2(arr) { return JSON.parse('[' + JSON.stringfy(arr).replace(/\[|\]/g, '') + ']') }
3
第三种方式可以使用 reduce( ) 函数来对数组进行递归处理
function flatArr3(arr) { return arr.reduce((a, b) = > { return a.concat(Array.isArray(b) ? flatArr3(b) : b) }, []) }
4
第四种方式就是通过暴力的递归来进行数组扁平化
function flatArr4(arr) { // 用于存放扁平化后的数组元素 let new_arr = [] // 定义一个递归函数 function innerArr(v) { for(let i = 0; i < v.length; i ++) { let item = v[i] // 判断是否为数组,是则递归遍历;否则直接添加到new_arr中 if(Array.isArray(item)) { innerArr(item) } else { new_arr.push(item) } } } innerArr(arr) return new_arr}
今天的【JS面试题】就讲到这里啦,谢谢大家的阅读。