Skip to content

将一个多维数组拍平为一个一维数组 #2

@Moriarty02

Description

@Moriarty02

简单算法02
描述:将一个多维数组拍平为一个一维数组

input

[1,2,3,[4,5],[6,[7,[8]]]]

output

[1,2,3,4,5,6,7,8]

我的解法:

这个题目是面试比较常考的题目

tips:判断是否为数组,一般提到的有三种方式

  1. Object.prototype.toString.call(arr)==="[object Array]"
  2. arr.constructor===Array
  3. Array.isArray(arr)

这三种我更喜欢用constructor
第一种 C++效率其实是最低的
第三种 兼容不好

目前我想到了三个方法

  1. 比较常见的解法是使用递归去遍历数组,wrap声明一个ret
    这个ret对下面的递归来说是一个可见的,可作为最后的输出
function wrap(){
    var ret=[];
    return function flat(a){
        for(var item of a){
            if(item.constructor===Array){
                ret.concat(flat(item))
            }else{
                ret.push(item)
            }
        }
        return ret
    }
}
  1. 这是比较取巧的方法,利用这是一个比较取巧的方法可以利用Array的toString方法将深度的值遍历出来,但是因为toString方法会把数字转化为字符串所以需要map一下把数字转回来,也是这个原因所以这个方法只适合全是数字的数组,如果类型不统一就不能这么了
function flat2(arr){
    return arr.toString().split(",").map(Number)
}
  1. ES6其实原生就支持了这个方法 Array.prototype.flat
function flat3(arr){
    return arr.flat(true)
}

值得提一下的是
这种原生支持的API因为底层是使用C++实现的,相比较下我自己实现的算法最后还需要一步编译成C++,其实原生的才是最快的

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions