数组降维方法

137 阅读1分钟

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的展开符(...),简单好用