关于数组扁平化

针对这样一个数组[3,[4,8,[9,1],3],[6,8],[2,10],5,7]想要将其展开,一般都会想到的是利用递归。 如下这样一个方法:

    function getArr(arr) {
        var newArr = [];
        for (let i of arr){
            if(Array.isArray(i)){
                newArr.push(...getArr(i))
            } else {
                newArr.push(i)
            }
        }
        return newArr
    }
1
2
3
4
5
6
7
8
9
10
11

但是这样的方法在数组嵌套非常深的情况下,很容易造成堆栈溢出,那么什么是堆栈溢出呢?

堆栈溢出就是栈是一种后进先出的数据结构,堆栈也是采用这种结构管理内存,调用过程中当最初的结果依赖于后面的计算处理,那么后面的部分虽然后开始处理,却先结束。当后续处理太多并且又依赖更后面的处理......(比如递归),便会一直压栈,当空间全部用完,就会造成“堆栈溢出”。 更通俗一点就是向一个水桶里装水,等装满了之后再加水就溢出了

这时候就应该换一种方法来解决这个问题

    function getArr(arr) {
        let stack = [...arr].reverse()
        let newArr = []
        while(stack.length){
        let o = stack.pop()
        if(Array.isArray(o)){
                stack.push(...o.reverse())
           } else {
                newArr.push(o)
           }
        }
        return newArr
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
最后更新时间: 10/8/2019, 7:41:17 PM