当前位置: 首页 > news >正文

实现数组扁平化的几种方式

目标: 实现数组扁平化[1,[2,[3,4,5]]] ==> [1,2,3,4,5]

我们有几种方法可以实现,分别为:

1、递归

function flatten(list){return list.reduce((tar, cur) => {if(Array.isArray(cur)){tar = tar.concat(flatten(cur));} else {tar.push(cur);}return tar;}, []);
}
flatten([1,[2,[3,4,5]]]) // [1, 2, 3, 4, 5]

递归的方法就是一直合并数组中是数组的元素,这里问题不大,这个方法适用于结构相对简单的数据,如果数据量特别的大,使用递归的话,回应性性能

2、toString方法

function flatten(list){let str = list.toString();return str.split(',').map(item => +item);
}
flatten([1,[2,[3,4,5]]]) // [1, 2, 3, 4, 5]

使用toString方法可以将数组转化为数组内部元素的字符串,然后针对该字符串返回扁平化的数组,只是这种方法如果遇到包含对象的数组就不行了

3、正则表达式结合JSON

function flatten(list){let newStr = JSON.stringify(list).replace(/\[|\]/g, '');return JSON.parse(`[${newStr}]`);
}
flatten([1,[2,[3,4,5]]]) // [1, 2, 3, 4, 5]

这个办法同样适用于结构相对简单的数组,如果遇到包含对象的数组就不行了

4、终极武器flat

[1,100,[2,[3,4,5]]].flat(3) // [1, 100, 2, 3, 4, 5]

利用数组的flat方法可以实现数组的扁平化
flat() 方法创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中。

flat传入的参数,指定要提取嵌套数组的结构深度,默认值为 1。
假使,我们不知道深度是多少的情况下,可以传入Infinity

[1,100,[2,[3,4,5]]].flat(Infinity) // [1, 100, 2, 3, 4, 5]

另外,使用flat() 方法会忽略数组中的空槽。

[1,2,,3,,,,6].flat() // [1,2,3,6]

所以,利用这个特性,我们还可以用它来删除数组的空槽数据哈!

记住吧!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 免费【2024】springboot 大学生心理健康诊断专家系统设计与开发
  • 13. 计算机网络HTTPS协议(一)
  • [论文精读]Multi-View Multi-Graph Embedding for Brain Network Clustering Analysis
  • File 34
  • 程序员离领导岗位还差什么
  • QPS(Queries Per Second)和TPS(Transactions Per Second)
  • 功能安全实战系列01-FlsTst(Flash Test)开发介绍
  • 【2.2 python中的变量】
  • linux运维一天一个shell命令之iostat详解
  • 陈文自媒体:AI写体育原创文案,效率提升10倍,收益飞起来!
  • vim列编辑模式
  • ARM 架构与技术综述
  • 模型表达方式
  • fastadmin插件市场暂不可用,是否切换到本地插件
  • 【Vue】全局组件和局部组件
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【React系列】如何构建React应用程序
  • AHK 中 = 和 == 等比较运算符的用法
  • Android优雅地处理按钮重复点击
  • Apache Spark Streaming 使用实例
  • E-HPC支持多队列管理和自动伸缩
  • extjs4学习之配置
  • HTTP中的ETag在移动客户端的应用
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • mysql外键的使用
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • win10下安装mysql5.7
  • 从重复到重用
  • 给Prometheus造假数据的方法
  • 简单基于spring的redis配置(单机和集群模式)
  • 驱动程序原理
  • 如何合理的规划jvm性能调优
  • 一道面试题引发的“血案”
  • 译有关态射的一切
  • 鱼骨图 - 如何绘制?
  • ​浅谈 Linux 中的 core dump 分析方法
  • # .NET Framework中使用命名管道进行进程间通信
  • (52)只出现一次的数字III
  • (PADS学习)第二章:原理图绘制 第一部分
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (力扣)循环队列的实现与详解(C语言)
  • (每日一问)基础知识:堆与栈的区别
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十六)一篇文章学会Java的常用API
  • (十一)图像的罗伯特梯度锐化
  • (算法二)滑动窗口
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)负载均衡,回话保持,cookie
  • (转载)跟我一起学习VIM - The Life Changing Editor