扁平数组

81 阅读1分钟

扁平数组

  1. 扁平数组可能是我们工作中常用的,Array提供了一个flag方法可以实现。但是我们自己如何实现呢?

  2. 实现方式一,使用递归+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)
}
  1. 实现方式二,递归
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())