定义: 将一个嵌套多层的数组转换为只有一层的数组
1.arr.flat([depth]) 其中depth是flat 的参数,表示数组的展开深度(默认不填、数值是1),即展开一层数组。Infinity,代表不论多少层都要展开。
var arr = [1, [2, [4, [5, [6]]]]]
function flatten(ary) {
return ary.flat(Infinity)
}
console.log(flatten(arr)) // [1,2,3,4,5,6]
- 扩展运算符
var arr = [1, [2, [4, [5, [6]]]]]
var arr1 = [
{
name:'张三'
},
[
{
name:'李四'
},
{
name:'王五'
}
]
]
function flatten2(ary) {
while(ary.some(item => Array.isArray(item))) {
ary = [].concat(...ary)
}
return ary
}
console.log(flatten2(arr)) // [1,2,3,4,5,6]
console.log(flatten2(arr1)) // ['[object Object]', '[object Object]', '[object Object]']
3.递归
var arr = [1,[2,[4,[5,[6]]]]]
function flatten(ary) {
let res = []
ary.forEach(item => {
if (Array.isArray(item)) {
res = res.concat(flatten(item))
} else {
res.push(item)
}
});
return res
}
console.log(flatten(arr))
4.reduce
var arr = [1, [2, [4, [5, [6]]]]]
function flatten(ary){
return ary.reduce((res, num) => {
return res.concat(Array.isArray(num) ? flatten(num) : num)
},[])
}
console.log(flatten(arr))
5.toString和split,缺点:元素类型会被转为字符串类型
var arr = [1, [2, [4, [5, [6]]]]]
function flatten(arr) {
return arr.toString().split(',')
}
console.log(flatten(arr)) // ['1','2','3','4','5','6']
6 JSON 和正则表达式
var arr = [1, [2, [4, [5, [6]]]]]
function flatten(arr) {
const str = '[' + JSON.stringify(arr).replace(/(\[|\])/g, '') + ']'
return JSON.parse(str)
}
console.log(flatten(arr))