JavaScript 简洁高效的多维数组降维

网上的数组降维方法有很多,大多写的又长又难懂,这里总结了三种优雅高效的方法,如果有更好的方法,欢迎评论区留言,大家一起探讨进步

<script>
    const arr = [1,[2,3,[4,5,"今晚",[6,'吃','什','么']]],{name: 'tom'}];

    /**
     * 适用于数值类型的多维数组降维
     * arr + '' 可以隐式转换为字符串类型,本质是调用了String()方法
     * +/- item 可以隐式转换为数值类型,会改变数值的正负性,本质是调用了Number()方法
     * Array.filter(Boolean)可以去除数组中的虚值(undefined、null、NaN、0、''、false),很好用
     * */
    const arrToString = arr + '';
    const stringArr = arrToString.split(',');
    const numberArr = stringArr.map(item => +item);
    console.log(arrToString);                // "1, 2, 3, 4, 5, 今晚, 6, 吃, 什, 么, [object Object]"
    console.log(stringArr);                  // ["1", "2", "3", "4", "5", "今晚", "6", "吃", "什", "么", "[object Object]"]
    console.log(numberArr);                  // [1, 2, 3, 4, 5, NaN, 6, NaN, NaN, NaN, NaN]
    console.log(numberArr.filter(Boolean));  // [1, 2, 3, 4, 5, 6]

    /**
     * 万能的方法,什么类型的多维数组都行,降维后不改变元素的类型,可以封装成工具类使用
     * instanceof用于判断一个变量是否是某个对象的实例
     * js的基本数据类型(Number、String、Boolean、undefined、null、symbol(ES6新增))
     * js的引用数据类型 Object(包含Array、Function等)
     *
     * 遍历第一次:[1,[2,3,[4,5,"今晚",[6,'吃','什','么']]],{name: 'tom'}] instanceof Array   // true   递归
     * 遍历第二次:1 instanceof Array                                                        // false  ret.push(1)
     * 遍历第三次:[2,3,[4,5,"今晚",[6,'吃','什','么']]] instanceof Array                     // true   递归
     * ....
     * 遍历最后一次:{name: "tome"} instanceof Array                                         // false  ret.push({name: "tome"})
     * */
    function flatten(arr){
        let ret = [];
        let forFlat = (arr) => arr.forEach(item => item instanceof Array ? forFlat(item) : ret.push(item));

        forFlat(arr);
        return ret;
    }
    console.log(flatten(arr)); // [1, 2, 3, 4, 5, "今晚", 6, "吃", "什", "么", {name: "tom"}]

    /**
     * 究极牛逼的方法,Array.flat(Infinity)展开任意深度的嵌套数组(ES6)
     * 如果不考虑兼容问题,这种方法或许是最好的,上面↑的方法可以对遍历的数据进行操作,这个只返回结果,具体看实际需求选择
     * */
    console.log(arr.flat(Infinity)); // [1, 2, 3, 4, 5, "今晚", 6, "吃", "什", "么", {name: "tom"}]
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值