数组降维

var arr=[1,2,[3,4,[5,6,7]],9,[10,11]];

// 1) 方法一  循环数组+递归调用
function steamroller (arr){
    var newArr=[];
    for(var i=0;i<arr.length;i++){
        if(Array.isArray(arr[i])){
            // 如果是数组,调用steamroller 将其扁平化
            // 然后在push 到newArr中
            newArr.push.apply(newArr,steamroller(arr[i]))
            //也可以不用apply
            // newArr.concat(steamroller(arr[i]))//这样写没有效果concat返回一个新数组不会改变原数组
            // newArr = newArr.concat(steamroller(arr[i]))
        }else {
            // 反之 不是数组,直接push进newArr
            newArr.push(arr[i])
        }
    }
    // 3.返回新的数组
    return newArr
}
console.log(steamroller(arr)); // [ 1, 2, 3, 4, 5, 6, 7, 9, 10, 11 ]

// 2) 方法二  利用apply+some
// 利用arr.some判断当数组中还有数组的话,递归调用steamroller2扁平函数(利用apply扁平), 用concat连接,最终返回arr;
function steamroller2(arr){
    while(arr.some(item=> Array.isArray(item))){
        // arr=[].concat.apply([],arr);
        //利用了 arr = arr.concat(1,2,[10,9],[8,7])这种用法
        arr=Array.prototype.concat.apply([],arr)
    }
    return arr
}
console.log(steamroller2(arr));

// 3) 方法三   reduce方法
// 当数组中还有数组的话,递归调用steamroller3扁平函数(利用reduce扁平), 用concat连接,最终返回arr.reduce的返回值;
function steamroller3(arr){
    return arr.reduce((prev,next)=>{
        return prev.concat(Array.isArray(next)?steamroller3(next):next)
    },[])
}
console.log(steamroller3(arr));

// 4) 方法四   es6 展开运算符
// 利用arr.some判断当数组中还有数组的话,递归调用flatten扁平函数(利用es6展开运算符扁平), 用concat连接,最终返回arr;

function steamroller4(arr){
    while(arr.some(item=> Array.isArray(item))){
        // arr=[].concat.apply([],arr)
        arr=[].concat(...arr)
    }
    return arr
}
console.log(steamroller4(arr));
//利用join和split方法
function steamroller5(arr) {
    return arr.join().split(',').map((item)=>+item)
}
console.log(steamroller5(arr));

function steamroller5b(arr) {
    return (arr+'').split(',').map((item)=>+item)
}
console.log(steamroller5b(arr));

有没有高手分析下这几种方法那个最好啊 哪个算法复杂度最优

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值