数组扁平化

207 阅读1分钟

toString

利用 toString 的遍历转化成字符串的特点来实现,然后对生成的字符串进行分割。

缺点:仅能对纯字符或者纯数字数组进行扁平化。

function flat(arr) {
    return arr.toString().split(',').map(i => parseFloat(i))
}

let a = [1, [2, 3, [4]]]
console.log(flat(a))

JSON.stringify

先看一下转换的效果

function flat(arr) {
    return JSON.stringify(arr)
}

let a = [1, [2, 3, [4]]]
console.log(flat(a))

显然,与 toString 不同的是,Json.stringify 得到的结果还需要去中括号操作,使用正则匹配进行替换即可。

function flat(arr) {
    return JSON.stringify(arr).replace(/(\[|\])/g, '').split(',').map(i => parseFloat(i)) //注意正则中不要随意加空格
}

let a = [1, [2, 3, [4]]]
console.log(flat(a))

递归遍历

支持所有类型数组的方法还是得自己通过遍历的方式来实现。

function flat(arr) {
    let res = []
    let help = (arr) => {
        for (let i = 0; i < arr.length; i++) {
            if (Array.isArray(arr[i])) { //优于 instanceOf Array,好像是因为iframes
                help(arr[i])
            } else {
                res.push(arr[i])
            }
        }
    }
    help(arr)
    return res
}

let a = [1, [2, 3, [4]]]
console.log(flat(a))