这是我参与8月更文挑战的第2天,活动详情查看: 8月更文挑战
数组扁平化的概念:就是指将一个多维数组转换为一维数组
[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]
1.递归实现
循环递归的方式,一项一项的去遍历,如果每一项还是一个数组就将进入递归递归。我们递归的子问题就是每层返回一个数组。
如果我们判断当前是一个数组,那么递归返回的也一定是一个数组,我们只需要将我们之前的来的newarr与我们的拼接即可。
代码实现:
let arr = [1, [2, [3, 4, 5]]];
function flatten(arr) {
let newarr = [];
let length = arr.length;
for (let i = 0; i < length; i++) {
if (Array.isArray(arr[i])) {
newarr = newarr.concat(flatten(arr[i]))
} else {
newarr.push(arr[i])
}
}
return newarr
}
console.log(flatten(arr))
2. reduce函数迭代
这种方式和上面的区别不大,上面是使用循环处理数组,我们这里可以用reduce来实现数组的拼接,从而简化第一种方式。
function flatten(arr) {
return arr.reduce((pre, next) => {
return pre.concat(Array.isArray(next)?flatten(next):[next])
}, [])
}
3.扩展运算符实现
这种实现是我们扩展运算符可以拿到我们数组中的每个元素,既然这样我们就可以使用它与concat结合来进行合并了,这样还不够,我们还需要时刻判断我们当前的arr里是否包含数组元素,如果有的话继续使用扩展运算符进行合并即可。
实现方式如下所示:
function flatten(arr) {
while(arr.some((item)=>Array.isArray(item))){
arr=[].concat(...arr)
}
return arr
}
console.log(flatten(arr))
4. splite和toString
可以通过 split 和 toString 两个方法来共同实现数组扁平化,由于数组会默认带一个 toString 的方法,所以可以把数组直接转换成逗号分隔的字符串,然后再用 split 方法把字符串重新转换为数组,如下面的代码所示:
function flatten(arr) {
return arr.toString().split(',')
}
console.log(flatten(arr))
5. ES6中的flat
我们还可以直接调用 ES6 中的 flat 方法来实现数组扁平化。flat 方法的语法:arr.flat([depth])
其中 depth 是 flat 的参数,depth 是可以传递数组的展开深度(默认不填、数值是 1),即展开一层数组。如果层数不确定,参数可以传进 Infinity,代表不论多少层都要展开:
function flatten(arr) {
return arr.flat(Infinity)
}
console.log(flatten(arr))
\