天天看点

JS数组的扁平化

ES5实现数组的扁平化

  • 递归

    如果当前是元素是数组则递归扁平化这个数组,再将返回的结果合并即可;否则就直接放入结果中。

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

function flatten (arr) {
    var res = [];
    for(var i = ; i < arr.length; i++) {
        if(Array.isArray(arr[i])) {
            res = res.concat(flatten(arr[i]));
        } else {
            res.push(arr[i]);
        }
    }
    return res;
}
           
  • 非递归

    非递归的扁平化无非就是要模拟递归版本的函数栈,我们使用

    Stack

    来模拟,而JS中没有现成的,勉强用数组来模拟一下

    Stack

    吧,无非是一个“先入后出”。如果遇到嵌套的数组,就一直解构它,直到变成单个的元素;接着处理原数组的下一个成员。

    下面的程序适用于数组元素为任何数据类型的扁平化,一般常用的

    toString()

    方法只适用于数组元素是数值的情况。
let array = [,,[,,[,]],["aaa",,[,[,[,["fff"],"ddd"], ], , ["12"], ], ]];

let result = [], queue = [];
let len = array.length;
for(let i = ; i < len; i++) {
    if(array[i] instanceof Array) {
        array[i].forEach(ele => {
            queue.push(ele);
        });
        while(queue.length > ) {
            let u = queue[];
            if(u instanceof Array) {
                queue.shift();
                let tmp = [];
                u.forEach(ele => {
                    tmp.push(ele);
                });
                queue = tmp.concat(queue);
            } else {
                result.push(u);
                queue.shift();
            }
        }
    } else {
        result.push(array[i])
    }
}

console.log(result);
//[ , , , , , , 'aaa', , , , , 'fff', 'ddd', , , '12', ,  ]
           

(完)

代码写得不好,勿喷