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 相关文章推荐
提高 DHTML 页面性能
Dec 25 Javascript
jquery delay()介绍及使用指南
Sep 02 Javascript
jQuery中document与window以及load与ready 区别详解
Dec 29 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
Oct 31 Javascript
基于jQuery实现Tabs选项卡自定义插件
Nov 21 Javascript
jQuery 实现左右两侧菜单添加、移除功能
Jan 02 jQuery
编写React组件项目实践分析
Mar 04 Javascript
Webpack打包字体font-awesome的方法示例
Apr 26 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 Javascript
详解vue 命名视图
Aug 14 Javascript
node.js通过url读取文件
Oct 16 Javascript
jQuery实现动态操作table行
Nov 23 jQuery
国庆节到了,利用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
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
精解window.setTimeout()&window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
jQuery 全选效果实现代码
2009/03/23 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
npm的lock机制解析
2019/06/20 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
Django中的Signal代码详解
2018/02/05 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
python实现共轭梯度法
2019/07/03 Python
python Xpath语法的使用
2020/11/26 Python
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
雪山饭庄的创业计划书范文
2014/01/18 职场文书
个人简历自我评价范文
2014/02/04 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
高二英语教学反思
2016/03/03 职场文书
Python实现批量自动整理文件
2022/03/16 Python