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

2023-11-08

数组扁平化

数组的扁平化就是将一个嵌套多层的数组转换为只有一层的数组,扁平化也是面试中常见的考题。举个简单的例子,假设有个名为 flatDeep 的函数能实现数组扁平化效果,代码运行效果如下面:

var array = [1, [2, [3, [4, 5]]]];
console.log(flatDeep(array)); // [1, 2, 3, 4,5]

像上述能实现扁平化的flatDeep函数实现方式有好几种,下面就尝试这几种方式实现一个flatDeep函数吧。

方法一:递归

通过循环递归的方式,一项一项地去遍历数组,如果每一项还是一个数组,那么就继续往下遍历,实现方式,如下所示:

var array = [1, [2, [3, [4, 5]]]];
function flatDeep(arr){
	let result = [];
	for(let i = 0; i < arr.length; i++) {
		if(Array.isArray(arr[i])){
			result = result.concat(flatDeep(arr[i]))
		} else {
			result.push(arr[i])
		}
	}
	return result;
}
console.log(flatDeep(array));

方法二:toString和split结合

先通过toString()把数组转成String对象,再结合split() 方法使用逗号分隔符将String对象分割成字符串数组,再用map函数将数组中的字符串转成数字。

var array = [1, [2, [3, [4, 5]]]];
function flatDeep(arr){
	let result = [];
	return result = arr.toString().split(',').map(Number)
}
console.log(flatDeep(array));

方法三:用reduce函数

使用reduce方法累加效果,实现思路跟常规的递归方法有些相似,代码如下:

var array = [1, [2, [3, [4, 5]]]];
function flatDeep(arr){
	return arr.reduce(function(pre,next){
		if(Array.isArray(next)){
			return pre.concat(flatDeep(next))
		} else {
			return pre.concat(next)
		}
	}, [])
}
// 以上代码还可用三目运算符做如下简化
function flatDeep(arr) {
	return arr.reduce((pre, next) => {
		return pre.concat(Array.isArray(next) ?  flatDeep(next) : next)
	},[])
}
console.log(flatDeep(array));

方法四:扩展运算符与some函数结合

先用数组的 some 方法把数组中仍然是组数的项过滤出来,然后执行 concat 操作,利用 ES6 的展开运算符,将其拼接到原数组中,最后返回原数组。代码如下:

var array = [1, [2, [3, [4, 5]]]];
function flatDeep(arr) {
	while(arr.some(item => Array.isArray(item))){
		arr = [].concat(...arr)
	}
	return arr;
}
console.log(flatDeep(array)); // [ 1, 2, 3, 4, 5 ]

方法五:ES6的flat方法

flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。语法为:

var newArray = arr.flat([depth])

参数depth是指定要提取嵌套数组的结构深度,默认值为1。参数depth也可以传进 Infinity,代表不论多少层都要展开。用 flat 方法实现的扁平化代码效果如下:

var array = [1, [2, [3, [4, 5]]]];
function flatDeep(arr) {
	return arr.flat(Infinity)
}
console.log(flatDeep(array)); // [ 1, 2, 3, 4, 5 ]

以上就是今天总结的5中实现数组扁平化的方式,其中最简单的就是直接调用flat函数啦。如果你有更好的实现方式也欢迎留言一起探讨。☺️

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js实现数组扁平化的几种方式 的相关文章

随机推荐

  • Java多线程Callable方法详解

    多线程实现方式转载自https blog csdn net bandenger article details 81637034 重点看Callable方法 以下内容是Callable方法实现多线程过程中涉及到的概念 ExecutorSer
  • java sql server 连接异常

    但1433端口号不可用 程序报错 com microsoft sqlserver jdbc SQLServerException 到主机 的 TCP IP 连接失败 java net ConnectException Connection
  • ubuntu中cmake编译arm linux应用程序实现

    CMake是一个跨平台的安装编译工具 使用起来非常简单 在开发arm linux过程中主要用它来生成makefile 进而根据makefile生成可执行文件 下面举一个简单的例子介绍下CMake的用法 bulid src strlen c
  • 滚动条事件window.onscroll

    获取页面某一元素的绝对X Y坐标 var X ElementID offset top var Y ElementID offset left 获取相对 父元素 位置 var X ElementID position top var Y E
  • Java基础学习一----命令提示符常用指令

    cmd命令提示符 Command 常用指令 cd gt 跳转 cd gt 跳转到上一级地址 C D E gt 跳转到C D E盘 dir gt 目录directory cls gt 清屏 clear screen
  • redis-benchmark(压力测试)

    redis benchmark 一 redis benchmark exe 二 redis benchmark命令 三 redis benchmark压力测试 我的redis是安装在windows系统的 linux系统用法都一样 一 red
  • 解决问题记录14:若依微服务版本报错记录

    1 网关启动报错 Failed to bind properties under spring cloud sentinel datasource ds1 nacos rule type to com alibaba cloud senti
  • Python内存缓存实现

    Python内存缓存实现 内存缓存是一种常用的优化技术 它可以将计算结果存储在内存中 以避免重复计算 提高程序的性能 在Python中 我们可以使用装饰器来实现内存缓存功能 本文将介绍如何使用Python实现一个简单的内存缓存 并提供相应的
  • VMware 虚拟机安装Linux(Ubuntu)系统教程

    VMware 虚拟机安装Linux Ubuntu 系统教程 1 准备的工具 2 虚拟机中新建Ubuntu系统 1 准备的工具 1 首先安装VMware 虚拟机软件 2 在linux Ubuntu官网下载iso镜像文件或者我放了个百度云盘的链
  • 设计模式-多业务,统一入口

    比如对接一些第三方 会有异步通知 或者在第三方设置唯一回调接口 或者统一验签等场景 这个时候可能就需要我们搞一个统一入口来处理不同的业务 1 定义统一入口 RestController RequestMapping value notify
  • GitHub和Gitee的源码下载

    1 使用clone命令下载 如果本地安装了Git环境的话 可以直接在命令行中使用git clone命令把仓库中的文件全部下载到本地 通过GitHub下载源码 执行如下命令 git clone https github com git 其中后
  • BigDecimal详解

    文章目录 前言 一 BigDecimal类 二 常用方法 1 构造方法 2 基本的运算 加法 减法 乘法 除法 3 保留小数 精确到几位 4 舍入的类型 ROUND UP向上舍入 ROUND DOWN向下舍入 ROUND CEILING正向
  • iOS import包

    Frameworks Frameworks 顾名思义就是框架 是第三方打包完成看不到源码 可以直接使用的 在项目中引用方式 OC 引用某一个文件 Frameworks一般会提供一个h文件引用全部其他文件 import
  • 【100天精通python】Day27:文件与IO操作_CSV文件处理

    目录 专栏导读 1 CSV文件格式简介 2 csv模块的使用方法 3 读写CSV文件的示例 3 1 读取CSV文件示例 3 2 写入CSV文件示例 4 CSV文件的常用数据处理 4 1 读取CSV文件的特定列 4 2 读取CSV文件的特定行
  • maven打包时和 deploy时候将不会 依赖包含在生成的项目 jar中方法

    用 provided
  • Python模块学习:glob 文件路径查找

    文章转载自 伯乐在线 原文出处 Darkbull Python模块学习 glob 文件路径查找 glob模块是最简单的模块之一 内容非常少 用它可以查找符合特定规则的文件路径名 跟使用windows下的文件搜索差不多 查找文件只用到三个匹配
  • 第2.2章 使用两个“半加器”实现一个“全加器”

    刚才的电路考虑了加法的运算结果可能会有进位 当A和B都为1时 可以作为最低位的运算电路 但不能计算其他位 十位 百位等 因为没有考虑低位的进位结果 因此 只能叫做半加器 Half Adder 实际上 一个完整的加法器的输入端有3个 A B和
  • 04-3. Huffman Codes (30)

    04 3 Huffman Codes 30 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN Yue In 1953 David A Huffman publishe
  • 1、若依VUE代码结构:官方文档+资料+总结

    来自官方文档 build 构建相关 bin 执行脚本 public 公共文件 favicon ico favicon图标 index html html模板 robots txt 反爬虫 src 源代码 api 所有请求 assets 主题
  • js实现数组扁平化的几种方式

    数组扁平化 数组的扁平化就是将一个嵌套多层的数组转换为只有一层的数组 扁平化也是面试中常见的考题 举个简单的例子 假设有个名为 flatDeep 的函数能实现数组扁平化效果 代码运行效果如下面 var array 1 2 3 4 5 con