数组扁平化,操作方法

news2024/9/22 15:48:47

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

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

目录

方法1: Array.prototype.flat()

 方法2:Array.prototype.toString() 和 Array.prototype.join()

 方法3:递归

方法4:扩展运算符 

方法5:序列化后正则


方法1: Array.prototype.flat()

 

ES10 引入了 Array.prototype.flat() 方法,使扁平数组变的简单。

const arr = [1, [2, [3, [4, 5]]], 6]

// 你可以指定展开多少层
arr.flat(1) // [1, 2, [3, [4, 5]], 6] 
arr.flat(2) // [1, 2, 3, [4, 5], 6] 

// 使用 Infinity 作为参数,可以展开无限嵌套数组
arr.flat(Infinity) // [1, 2, 3, 4, 5, 6]

 方法2:Array.prototype.toString() 和 Array.prototype.join()

如果数组的元素都是数字,那么我们可以考虑使用 Array.prototype.toString() 或 Array.prototype.join() 方法。 

    调用数组的Array.prototype.toString()方法,将数组转为字符串再用String.prototype.split()分割还原为数组。

const flatten = arr => arr.toString().split(',').map(item => +item)

flatten(arr) // [1, 2, 3, 4, 5, 6]

Array.prototype.join() 也可以实现同样的效果:

const flatten = arr => arr.join(',').split(',').map(item => +item)

flatten(arr) // [1, 2, 3, 4, 5, 6]

 方法3:递归

    对于具有更深层嵌套的数组,可以使用递归。

    使用 Array.prototype.reduce() 遍历数组的每一项,若值为数组则递归遍历,否则使用 Array.prototype.concat() 拼接。

			const flatten = (arr) => {
				return arr.reduce(
					(acc, val) =>
					Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val),
					[],
				)
			}

			flatten(arr) // [1, 2, 3, 4, 5, 6]

方法4:扩展运算符 

 使用 Array.prototype.concat() 配合扩展运算符(...)展开一级嵌套数组

// 这仅适用于一级嵌套数组
[].concat(...arr) // [1, 2, [3, [4, 5]], 6] 

// 较旧的浏览器解决方案  
[].concat.apply([], arr) // [1, 2, [3, [4, 5]], 6] 

在配合 while 循环,只要有一个元素有数组,那么循环继续

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

			flatten(arr) // [1, 2, 3, 4, 5, 6]

方法5:序列化后正则

const str = `[${JSON.stringify(arr).replace(/(\[|\])/g, '')}]`
JSON.parse(str)   // [1, 2, 3, 4, 5, 6]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos下安装ActiveMQ消息中间件

记录一下在centos7.x下面安装activeMQ消息中间件在安装ActiveMQ之前必须保证服务器安装了java环境安装java环境的地址:安装java环境找到activeMQ的官网下载安装包https://activemq.apache.org/components/classic/download/java版本是java8从官网下载后(apache-activemq-5.16.5…

【Linux】题解:生产者与消费者模型(附源代码)

【Linux】题解:生产者与消费者模型(附源代码) 摘要:本文主要介绍生产者与消费者模型,其中主要内容分为对该模型的介绍及分析,阻塞队列实现该模型,并对其升级实现多生产者多消费者并行执行。其中…

Day14 基于AOP的声明式事务控制

1 Spring 事务编程概述PlatformTransactionManager TransactionDefinition TransactionStatus2 搭建环境数据库准备一个账户表tb account;dao层准备一个AccountMapper,包括incrMoney和decrMoney两个方法;service层准备一个transferMoney方法,分别调用in…

18行列式及其性质

从此课开始,就进入了这门课的第二部分。迄今为止,已经学习了很多关于长方矩阵的知识,现在,把注意力转向方阵,探讨两个大的话题:行列式和特征值,需要行列式的重要原因是求特征值。 行列式是跟每…

U3772频谱分析仪

18320918653 U3772 新的便携式频谱分析仪具有体积小,重量轻的特点,可以在微波和毫米波范围内测量无线信号日本株式会社爱德万测试是全球半导体测试系统的领先企业,于2005年7月6日发布了一种新的便携式频谱分析仪U3771(频率达到3…

[Java-多线程] 锁原理(轻量级锁、锁膨胀、自旋锁、偏向锁)

1.Java对象头 我们平时使用的对象都是由两部分组成, 第一部分是对象头, 第二部分是对象的成员变量, 这里我么主要讲解对象头, 以32为虚拟机为例 : Object Header (64 bits)Mark Word (32 bits)Klass Word (32 bits)Klass Word : 每个对象都有类型 通过Klass Word就可以找到对应…

离散数学与组合数学-07命题逻辑

文章目录离散数学与组合数学-07命题逻辑7.1 命题逻辑-什么是命题7.1.1 数理逻辑发展7.1.2 什么是命题7.1.3 复合命题7.2 命题逻辑-命题联结词7.2.1 否定联结词7.2.2 合取联结词7.2.3 析取联结词7.2.4 蕴涵联结词7.2.5 等价联结词7.3 命题逻辑-命题符号化及应用7.3.1 联结词总结…

什么是JMM模型

什么是JMM模型?Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素&#xff…

11. 线程本地变量ThreadLocal的使用

1. 对ThreadLocal的理解 ThreadLocal,有人称它为线程本地变量,也有人称它为线程本地存储,其实表达的意思是一样的。ThreadLocal在每一个变量中都会创建一个副本,每个线程都可以访问自己内部的副本变量。 在多线程环境下&#xff…

tomcat 的并发能力分析

tomcat 参考:Tomcat的3个参数acceptCount、maxConnections、maxThreads Tomcat 的核心组件 Tomcat 由 2 大核心组件组成:Connector、Container Tomcat 处理请求的过程 请求在 tomcat 服务器的处理过程(BIO 模式) 客户端与服务…

嵌入式串行通信协议

嵌入式系统中,不同芯片之间通常使用串行总线的方式进行连接,根据器件行业规范、应用场景,不同芯片通常选择不同的串行通信接口进行通信。常用的串行通信接口有:1-Wire、I2C、SPI、UART。 一、1-Wire 1-wire单总线是Maxim的全资子…

bodgeito通关教程

6.bodgeito通关教程 进入网站整体浏览网页 点击页面评分进入关卡 一般搭建之后这里都是红色的&#xff0c;黄色是代表接近&#xff0c;绿色代表过关 首先来到搜索处本着见框就插的原则 构造payload输入 <script> alert(/xss/)</script>成功弹窗xss&#xff0c;发…

Redis数据库

1.Redis简介 1.1Redis简介 Redis 是当前互联网世界最为流行的 NoSQL&#xff08;Not Only SQL&#xff09;数据库。NoSQL 在互联网系统中的作用很大&#xff0c;因为它可以在很大程度上提高互联网系统的性能。 Redis 具备一定持久层的功能&#xff0c;也可以作为一种缓存工具…

c++实现堆排序

看了一下优先队列&#xff0c;查了一下堆排序。堆排序主要就是建最大堆&#xff08;最小堆&#xff09;和交换2个操作。如果建的是最大堆&#xff0c;那么交换的时候&#xff0c;父节点就和最大的子节点比较&#xff0c;如果它比最大的子节点还大&#xff0c;那就不用比了。因为…

STM32MP157开发板Linux+Qt项目实战:智能猫眼

stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器&#xff0c;集成2Cortex-A7核和1个Cortex-M4 核&#xff0c;A7核上可以跑Linux操作系统&#xff0c;M4核上可以跑FreeRTOS…

docker 搭建postgres 主从 pgadmin

准备工作 创建一个docker bridge 网路用于测试 docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 pgnetwork # 查看 docker network ls 设置了网段为 192.168.0.0&#xff0c;规划主从库IP端口如下&#xff1a; 主库 192.168.0.101:5432 从库…

Ubuntu16.04安装深度学习环境(CUDA9.2+PyTorch0.4.1+Python2.7)

之前已经安装好了显卡驱动&#xff0c;接着就可以安装CUDA了于是又找了好几篇文章进行参考&#xff1a;https://zhuanlan.zhihu.com/p/361190040https://blog.csdn.net/qq_43665602/article/details/125752433https://blog.csdn.net/myg22/article/details/84029924https://blo…

二、数据缓存

文章目录数据缓存1.标准缓存流程2.缓存更新一致性3.缓存穿透解决方案缓存空对象布隆过滤器4.缓存雪崩解决方案5.缓存击穿解决方案互斥锁逻辑过期6.使用函数式接口封装工具类学习 黑马点评项目整理总结: https://www.bilibili.com/video/BV1cr4y1671t/?vd_source5f3396d3af2c39…

webpack项目配置

30.webpack——webpack5新特性&#xff08;启动、持久化缓存、资源模块、URIs、moduleIds和chunkIds、tree shaking、nodeJs的polyfill被移除、模块联邦&#xff09;_俞华的博客-CSDN博客_chunkids webpack和vite的区别 - 简书 vite介绍 &#xff5c; 与其他构建工具做比较&…

【ONE·C || 字符串和内存函数】

总言 C语言&#xff1a;字符串和内存函数使用介绍。 文章目录总言1、求字符串长度&#xff1a;strlen1.1、基本介绍1.2、演示说明1.2.1、strlen输出1.2.2、strlen返回值1.3、模拟实现strlen1.3.1、计数器写法1.3.2、递归写法1.3.3、指针-指针写法2、长度不受限制的字符串函数2.…