1.利用生成器函数
function flat(tree) {
function* iterTree(tree) {
if (Array.isArray(tree)) {
for (let i = 0; i < tree.length; i++) {
yield* iterTree(tree[i]);
}
} else {
yield tree;
}
}
let ret = []
for (let x of iterTree(tree)) {
ret.push(x)
}
return ret
}
const tree = ['a', ['b', 'c'], ['d', 'e', ['f']]];
console.log(flat(tree)) //['a', 'b', 'c', 'd', 'e', f]
2.利用concat、es6拓展运算符、some、Array.isArray、递归、reduce
//法一
function flatArr(arr) {
//concat方法每次会拉平一层
let newArr = [].concat(...arr);
return newArr.some(Array.isArray) ? flatArr(newArr) : newArr;
}
//法二
const newArr = function(arr){
return arr.reduce(
(pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur)
,[])
}
//展开特定层
const flatten = (arr, depth = 1) =>
arr.reduce((a, v) => a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v), []);
3.遍历方法
function flattenArr (arr){
var result=[]
function flatten(arr){
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
flatten(arr[i]);
}else{
result.push(arr[i]);
}
}
}
flatten(arr);
return result;
}
function flattenByDeep(array,deep){
var result = [];
for(var i = 0 ; i < array.length; i++){
if(Array.isArray(array[i]) && deep >= 1){
result = result.concat(flattenByDeep(array[i],deep -1))
}else{
result.push(array[i])
}
}
return result;
}
4.利用数组join()或toString()方法;
arr.join().split(',')
JSON.parse(`[${arr.join()}]`)
arr.toString().split(',')
JSON.parse(`[${arr.toString()}]`)
//例:
let arr=[1, 2, [3, 4, [5, 6]]]
let newArr = flattenArr(arr) = [1, 2, 3, 4, 5, 6]
5.也可以用es6数组的flat()方法
flat方法默认打平一层嵌套,也可以接受一个参数 表示打平的层数,传 Infinity 可以打平任意层。
注:es6新增方法有时候可能会失效,无法使用,这个坑我踩过,可能是浏览器版本过低不支持的原因,大部分情况下是可以使用的,自己斟酌。
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
//如果原数组有空位,flat()方法会跳过空位
[1, 2, , 4, 5].flat()
// [1, 2, 4, 5]