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', , ]
(完)
代码写得不好,勿喷