天天看點

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', ,  ]
           

(完)

代碼寫得不好,勿噴