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;
}
-
非遞歸
非遞歸的扁平化無非就是要模拟遞歸版本的函數棧,我們使用
來模拟,而JS中沒有現成的,勉強用數組來模拟一下Stack
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', , ]
(完)
代碼寫得不好,勿噴