5种 JavaScript 方式实现数组扁平化


Posted in Javascript onOctober 05, 2021

一、数组扁平化概念

数组扁平化是指将一个多维数组变为一维数组

[1, [2, 3, [4, 5]]]  ------>    [1, 2, 3, 4, 5]

二、实现

1. reduce

遍历数组每一项,若值为数组则递归遍历,否则concat

function flatten(arr) {  
    return arr.reduce((result, item)=> {
        return result.concat(Array.isArray(item) ? flatten(item) : item);
    }, []);
}

reduce是数组的一种方法,它接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce包含两个参数:回调函数,传给total的初始值

// 求数组的各项值相加的和: 
arr.reduce((total, item)=> {  // total为之前的计算结果,item为数组的各项值
    return total + item;
}, 0);

2. toString & split

调用数组的toString方法,将数组变为字符串然后再用split分割还原为数组

function flatten(arr) {
    return arr.toString().split(',').map(function(item) {
        return Number(item);
    })
}

因为split分割后形成的数组的每一项值为字符串,所以需要用一个map方法遍历数组将其每一项转换为数值型

3. join & split

和上面的toString一样,join也可以将数组转换为字符串

function flatten(arr) {
    return arr.join(',').split(',').map(function(item) {
        return parseInt(item);
    })
}

4. 递归

递归的遍历每一项,若为数组则继续遍历,否则concat

function flatten(arr) {
    var res = [];
    arr.map(item => {
        if(Array.isArray(item)) {
            res = res.concat(flatten(item));
        } else {
            res.push(item);
        }
    });
    return res;
}

5. 扩展运算符

es6的扩展运算符能将二维数组变为一维

[].concat(...[1, 2, 3, [4, 5]]);  // [1, 2, 3, 4, 5]

根据这个结果我们可以做一个遍历,若arr中含有数组则使用一次扩展运算符,直至没有为止。

function flatten(arr) {
    while(arr.some(item=>Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}

总结:

到此这篇关于5种 JavaScript 方式实现数组扁平化的文章就介绍到这了,更多相关JavaScript 实现数组扁平化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript offsetX与layerX区别
Mar 12 Javascript
JS不间断向上滚动效果代码
Dec 25 Javascript
JavaScript实现的双向跨域插件分享
Jan 31 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
jQuery控制div实现随滚动条滚动效果
Jun 07 Javascript
window.open打开窗口被拦截的快速解决方法
Aug 04 Javascript
JQuery validate 验证一个单独的表单元素实例
Feb 17 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
Dec 13 Javascript
JavaScript设计模式之策略模式实现原理详解
May 29 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
Nov 12 Javascript
js重写alert事件(避免alert弹框标题出现网址)
Dec 04 Javascript
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
Oct 05 #Javascript
Javascript设计模式之原型模式详细
JS数组方法some、every和find的使用详情
8个JS的reduce使用实例和reduce操作方式
Oct 05 #Javascript
JS 4个超级实用的小技巧 提升开发效率
Oct 05 #Javascript
JavaScript实现简单拖拽效果
Sep 15 #Javascript
一小时迅速入门Mybatis之bind与多数据源支持 Java API
Sep 15 #Javascript
You might like
浅谈PHP语法(1)
2006/10/09 PHP
PHP 图片上传实现代码 带详细注释
2010/04/29 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
php微信开发之图片回复功能
2018/06/14 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
JS实现页面打印功能
2017/03/16 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
支教自我鉴定
2014/01/18 职场文书
乔迁宴答谢词
2014/01/21 职场文书
关于赌博的检讨书
2014/01/24 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
一句话工作感言
2014/03/01 职场文书
保险公司开门红口号
2014/06/21 职场文书
教师演讲稿开场白
2014/08/25 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
2014年教务工作总结
2014/12/03 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
观后感的写法
2015/06/19 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书