扁平数组
-
扁平数组可能是我们工作中常用的,Array提供了一个flag方法可以实现。但是我们自己如何实现呢?
-
实现方式一,使用递归+concat【concat可以扁平一层数组】
function myFlat(array=[]){
let isDeep = array.some(item => item instanceof Array)
if (!isDeep) return array
let res = Array.prototype.concat.apply([],array)
return myFlat(res)
}
- 实现方式二,递归
function myFlat2(arr=[],res = []){
for (let item of arr){
if (item instanceof Array){
myFlat2(item,res)
}else {
res.push(item)
}
}
return res
}
// 扁平数组
function myFlat(arr = [1,[2,3],4,[5,[6,[7]]]]){
const _arr = []
arr.forEach(item=>{
if(Array.isArray(item)){
_arr.push(...myFlat(item))
}else{
_arr.push(item)
}
})
return _arr
}
console.log('myFlat',myFlat())
function myFlat2(arr = [1,[2,3],4,[5,[6,[7]]]]){
const _arr = []
if(!arr.some(item => Array.isArray(item))){
return arr
}
return myFlat2(_arr.concat(...arr))
}
console.log('myFlat2',myFlat2())
function myFlat3(arr = [1,[2,3],4,[5,[6,[7]]]]){
const _arr = []
if(!arr.some(item => Array.isArray(item))){
return arr
}
return myFlat2(Array.prototype.concat.apply(_arr,arr))
}
console.log('myFlat3',myFlat3())
// 扁平数组
function myFlat4(arr = [1,[2,3],4,[5,[6,[7]]]], depth = 2){
if(depth < 1) return arr
const _arr = []
arr.forEach(item=>{
if(Array.isArray(item)){
_arr.push(...myFlat4(item,depth-1))
}else{
_arr.push(item)
}
})
return _arr
}
console.log('myFlat4',myFlat4())
// 扁平数组
function myFlat5(arr = [1,[2,3],4,[5,[6,[7]]]], depth = 10){
if(depth < 1) return arr
return arr.reduce((pre,cur)=>(Array.isArray(cur) ? pre.push(...myFlat5(cur,depth-1)) : pre.push(cur), pre),[])
}
console.log('myFlat5',myFlat5())