let a = [1, [2, 3], [4, [5, [6, 7, 8]]], [9, 10]];
1、ES6方法
let aRes= a.flat(Infinity);
2、for循环 递归
function flatten(arr) {
var res = [];
for (let i = 0, length = arr.length; i < length; i++) {
if (Array.isArray(arr[i])) {
res = [...res, ...flatten(arr[i])]
} else {
res.push(arr[i]);
}
}
return res;
}
let aRes = flatten(a);
console.log(aRes)
3、while循环
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
let aRes = flatten(a);
console.log(aRes)
4、reduct 递归
function flatten(arr) {
return arr.reduce((res, next) => {
let nextArr = Array.isArray(next) ? flatten(next) : [next]
return [...res, ...nextArr]
}, []);
}
let aRes = flatten(a);
console.log(aRes)
5、shift unshift 方法
function flatten(arr) {
const arrTemp = [...arr];
const result = [];
while (arrTemp.length) {
const first = arrTemp.shift();
if (Array.isArray(first)) {
arrTemp.unshift(...first);
} else {
result.push(first);
}
}
return result;
}
6、replact JSON.stringify 暴力法
function flatten(arr) {
let arrStr = JSON.stringify(arr)
let aResStr = arrStr.replace(/\[/g, '').replace(/\]/g, '')
let aResArr = aResStr.split(',')
return aResArr.map((item) => Number(item))
}
总结性能
结论是:
- 1、性能最好的是es6的falt()
- 2、最差的就是while() reduce()
- 3、剩下的方法差距都不是很大。
如果有可能支持新属性,最好使用新属性,或者stack()方法。