JavaScript 数组拍平

515 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

JavaScript 数组拍平

一、功能

将多层嵌套的数组拍平为一层,也叫数组扁平化

二、实现

1. ES5 返回新数组
// ES5 返回新数组

const _flat = function (arr) {
    let copy = [];
    arr.forEach((val) => {
        if (Array.isArray(val)) {
            copy = copy.concat(_flat(val))
        } else {
            copy = copy.concat(val)
        }
    })
    return copy
}
2. ES5 放在数组类的原型上
// ES5 放在数组类的原型上

Array.prototype._flat = function(){
    let copy = []
    this.forEach((val)=>{
        if(Array.isArray(val)){
            copy = copy.concat(val._flat())
        }else{
            copy = copy.concat(val)
        }
    })

    return copy
}
3. 一行搞定
// 一行搞定

Array.prototype._flat=function(){
    return [].concat(...this.map((val=>Array.isArray(val)?val._flat():val)))
}
4. 数组的toString方法
// 数组的toString方法
// var arr = [[1, 2, 3], [6, 7, [10, 11, [12]]]]

// 特别注意toString方法返回的字符串是用 “ ,” 分割的
// 数组元素全都是 数值类型 时适用


Array.prototype._flat = function () {
    let copyStr = this.toString();         // "1,2,3,6,7,10,11,12"
    let copyArr = copyStr.split(",")       // ['1', '2', '3', '6', '7', '10', '11', '12']
    let res = copyArr.map(x => x - 0)      // [1, 2, 3, 6, 7, 10, 11, 12]
    return res
}

// 一行搞定

Array.prototype._flat = function () {
    return this.toString().split(",").map(x => x - 0)
}

5. 用 reduce 实现 flat 函数
// 用 `reduce` 实现 `flat` 函数

const _flat = function (arr) {
    return arr.reduce((pre, cur) => { return pre.concat(Array.isArray(cur) ? _flat(cur) : cur) }, [])
}
6. 控制拍平的层数
// 控制拍平的层数

// 用一个变量level来记录拍平的层数,默认值设为 Infinity, Infinity-- > 0 恒成立

const _flat = function (arr, level = Infinity) {
    return level > 0 ? arr.reduce((pre, cur) => { return pre.concat(Array.isArray(cur) ? _flat(cur, level - 1) : cur) }, []) : arr.concat()
}