前端面试之多维数组扁平化

334 阅读1分钟

多维数组扁平化, 先来个简单的

1. 二维数组变一维

使用 Array.prototype.flat() 特性

基本用法

var arr1 = [1,2,3,[4,5]]
console.log(arr1.flat())
// [1,2,3,4,5]

flag 默认会将二维数组转一维,

flag() 方法会移除数组中的空项

var arr2 = [1,2,,[4,5]]
console.log(arr2.flat())
// [1,2,3,4,5]

2. 多维数组变一维

2.1 使用 Infinity 可以展开任意深度的嵌套数组

var arr3 = [1,2,[3,[4,],5]]
console.log(arr3.flag(Infinity))
// [1,2,3,4,5]

2.2 使用 reduceconcat

var arr = [1,2,[3,4]];

arr.reduce(
    (arr,val) => acc.concat(val),[]
)
// [1,2,3,4]

// 使用扩展运算符 (只支持二维)
[].concat(...arr)

3. 任意维度转换

reduce + concat + isArray + recursivity

// 使用 reduce concat 和递归展开无限多层嵌套的数组
var arr = [1,2,3,[1,2,3,4,[2,3,4]]];

function flagDeep(arr,d=1){
    return d > 0 ? 
        arr.reduce(
            (acc, val) => 
                acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), []
            )
        : arr.slice();
}

// arr.slice(start,end)  不改变原数组

flatDeep( arr, Infinity )

思路

1. d > 0 , 则遍历, Infinity 无限大

2. 利用 reduce 遍历, acc(累计器) concat 新元素

3. 假如 新值 是数组, 则 deep , 否则 本身

4. 最后 slice (不改变原数组)