顾名思义 就是将数组中数组全部扁平化
常规APi
需要考虑兼容性 ie不支持 chrome需要版本69之上
[].flat()
手动实现flat
const flat = (arr, depth = 1) => {
return depth >0 ? arr.reduce((prev, curr) => {
if (Array.isArray(curr)) {
return [...prev, ...flat(curr, depth - 1)]
}
return [...prev, curr]
}, []) :
arr
}
const flat = (arr, depth = 1) => {
return depth > 0 ? arr.reduce((prev, curr) => {
prev = prev.concat(Array.isArray(curr) ? flat(curr, depth - 1) : curr);
return prev;
}, []) : arr
}
lodash
平时开发足够 简单快捷
_.flattenDeep(arr)
循环+创建一个新数组
function flatten(arr) {
let res = []
arr.forEach(item => {
if (Array.isArray(item)) {
res.push(...flatten(item));
// res = res.concat(flatten(item))
} else {
res.push(item)
}
})
return res;
}
while
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
// es 5 写法
//arr = Array.prototype.concat.apply([], arr)
arr = [].concat(...arr);
}
return arr;
}
reduce
function flatDeep(arr) {
return Array.isArray(arr) ?
arr.reduce((prev, curr) => {
prev = [...prev, ...flatDeep(curr)];
return prev
}, []) : [arr]
}
function flatten(arr) {
return arr.reduce((prev, curr) => {
prev = prev.concat(Array.isArray(curr) ? flatten(curr) : curr)
return prev;
}, [])
}
利用栈
function flat(arr) {
let copyArr = arr.slice();
const res = [];
while (copyArr.length) {
const first = copyArr.shift();
if (Array.isArray(first)) {
copyArr.unshift(...first)
} else {
res.push(first)
}
}
return res;
}