flat
数组降维最简单好用的方法还是ES6的flat()和flatMap()方法
flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1
flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。
// 相当于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]
flatMap()只能展开一层数组。
啊!简单粗暴,再来看点别的方法吧
concat方法实现降维
先了解一下原理,concat方法我们常用来实现数组合并,当方法的第一个参数是一个元素时,这个元素会直接被插入到新数组。如果第一个参数是数组,那么数组里的元素会被插入到新数组,利用这一点可以对数组进行降维。
let arr = [1,2,[3,4],[5,6]]
function dimensionalityReduction(arr) {
let result = []
for(let i = 0; i < arr.length; i++) {
result = result.concat(arr[i])
}
return result
}
dimensionalityReduction(arr) // [1,2,3,4,5]
降维是实现了,但这还要手动写for循环,看起来不太美
concat配合apply实现数组降维
apply方法会调用一个函数,第一个参数作为函数的this的值,第二个参数作为被调用对象的arguments值,这样数组的各个元素就会依次被调用
let arr = [1,2,[3,4],[5,6]]
function dimensionalityReduction(arr) {
let result = Array.prototype.concat.apply([],arr)
return result
}
dimensionalityReduction(arr) // [1,2,3,4,5]
concat配合reduce实现数组降维
reduce方法可以传入一个函数对数组的每一个值进行操作,利用这个特性可以省去手动for循环,由于是对每个值进行操作,利用递归可以实现多维度数组降重
let arr = [1,2,[3,4],[5,[6,7]]]
function dimensionalityReduction(arr) {
return arr.reduce((result,item)=>{
return Array.isArray(item) ?result.concat(dimensionalityReduction(item)) : result.concat(item)
},[])
}
dimensionalityReduction(arr) // [1,2,3,4,5]
数组降维方法还有很多,不管简单还是复杂,只要符合需求就行,我在实际业务中用用到最多的其实还是ES6的展开符(...),简单好用。