JavaScript实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。

大白话实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。

思路

实现数组扁平化的基本思路是遍历数组中的每个元素,如果元素是数组,就递归地将其扁平化并添加到结果数组中;如果元素不是数组,就直接添加到结果数组中。

代码示例

function flatten(arr) {// 创建一个空数组,用于存储扁平化后的结果let flattened = [];// 遍历输入数组中的每个元素for (let i = 0; i < arr.length; i++) {// 检查当前元素是否为数组if (Array.isArray(arr[i])) {// 如果当前元素是数组,递归调用 flatten 函数对其进行扁平化// 并将扁平化后的结果添加到 flattened 数组中flattened = flattened.concat(flatten(arr[i]));} else {// 如果当前元素不是数组,直接将其添加到 flattened 数组中flattened.push(arr[i]);}}// 返回扁平化后的数组return flattened;
}// 测试示例
const multiDimensionalArray = [1, [2, [3, 4], 5], 6, [7, 8]];
const flattenedArray = flatten(multiDimensionalArray);
console.log(flattenedArray);

代码解释

  1. 函数定义

    • function flatten(arr):定义了一个名为 flatten 的函数,它接受一个数组 arr 作为参数。
  2. 初始化结果数组

    • let flattened = [];:创建一个空数组 flattened,用于存储扁平化后的结果。
  3. 遍历数组

    • for (let i = 0; i < arr.length; i++):使用 for 循环遍历输入数组 arr 中的每个元素。
  4. 检查元素类型

    • if (Array.isArray(arr[i])):使用 Array.isArray 方法检查当前元素是否为数组。
  5. 递归处理数组元素

    • flattened = flattened.concat(flatten(arr[i]));:如果当前元素是数组,递归调用 flatten 函数对其进行扁平化,并使用 concat 方法将扁平化后的结果添加到 flattened 数组中。
  6. 处理非数组元素

    • flattened.push(arr[i]);:如果当前元素不是数组,直接使用 push 方法将其添加到 flattened 数组中。
  7. 返回结果

    • return flattened;:返回扁平化后的数组。

除了递归,还有其他方法可以实现数组扁平化吗?

除了递归方法,还有几种不同的方式可以实现数组扁平化,下面为你详细介绍:

方法一:使用 reduceconcat 方法

reduce 方法可以对数组中的每个元素执行一个提供的函数,并将其结果汇总为单个值。结合 concat 方法可以有效实现数组扁平化。

function flatten(arr) {// 使用 reduce 方法遍历数组return arr.reduce((acc, val) => {// 如果当前元素是数组,使用 concat 方法将其扁平化后添加到累加器中// 如果不是数组,直接添加到累加器中return acc.concat(Array.isArray(val)? flatten(val) : val);}, []);
}// 测试示例
const multiDimensionalArray = [1, [2, [3, 4], 5], 6, [7, 8]];
const flattenedArray = flatten(multiDimensionalArray);
console.log(flattenedArray);

此代码中,reduce 方法遍历数组的每个元素,若元素是数组,就递归调用 flatten 函数将其扁平化,再用 concat 方法添加到累加器;若不是数组则直接添加到累加器。

方法二:使用 flat 方法

flat 是 JavaScript 数组自带的方法,能直接实现数组扁平化。可以指定扁平化的深度,若要完全扁平化,可传入 Infinity

const multiDimensionalArray = [1, [2, [3, 4], 5], 6, [7, 8]];
// 使用 flat 方法并传入 Infinity 实现完全扁平化
const flattenedArray = multiDimensionalArray.flat(Infinity);
console.log(flattenedArray);

这种方法简洁直观,直接调用 flat 方法并传入 Infinity 就能把多维数组完全扁平化为一维数组。

方法三:使用 while 循环和 some 方法

通过 some 方法检查数组中是否还有嵌套数组,若有就使用 concat 方法展开,借助 while 循环持续处理,直至没有嵌套数组。

function flatten(arr) {let isNested = true;// 当数组中还有嵌套数组时继续循环while (isNested) {isNested = false;let newArr = [];// 遍历数组for (let i = 0; i < arr.length; i++) {if (Array.isArray(arr[i])) {// 如果是数组,将其元素添加到新数组中newArr = newArr.concat(arr[i]);isNested = true;} else {// 不是数组则直接添加到新数组newArr.push(arr[i]);}}arr = newArr;}return arr;
}// 测试示例
const multiDimensionalArray = [1, [2, [3, 4], 5], 6, [7, 8]];
const flattenedArray = flatten(multiDimensionalArray);
console.log(flattenedArray);

此代码利用 while 循环和 some 方法不断检查并展开嵌套数组,直到数组中不存在嵌套数组,最终得到一维数组。

哪种方法实现数组扁平化的效率更高?

递归方法

function flatten(arr) {let flattened = [];for (let i = 0; i < arr.length; i++) {if (Array.isArray(arr[i])) {flattened = flattened.concat(flatten(arr[i]));} else {flattened.push(arr[i]);}}return flattened;
}
  • 优点:代码逻辑直观,易于理解和实现,适合处理嵌套层级不深、数据规模较小的数组。
  • 缺点:当数组嵌套层级很深时,递归调用会导致大量的函数调用栈,可能引发栈溢出错误,而且函数调用的开销也会使性能下降。

使用 reduceconcat 方法

function flatten(arr) {return arr.reduce((acc, val) => {return acc.concat(Array.isArray(val)? flatten(val) : val);}, []);
}
  • 优点:代码简洁,同样基于递归思想,借助 reduce 方法实现数组遍历和结果累加,处理逻辑清晰。
  • 缺点:和递归方法一样,在处理深度嵌套数组时,由于递归调用过多,会有栈溢出风险,性能也会受影响。

使用 flat 方法

const flattenedArray = multiDimensionalArray.flat(Infinity);
  • 优点:这是 JavaScript 原生提供的方法,由浏览器引擎底层实现,经过高度优化,性能通常较好。使用 Infinity 作为参数能轻松处理任意嵌套深度的数组,代码简洁高效。
  • 缺点:该方法是 ES2019 引入的新特性,对于一些较旧的浏览器版本可能不支持,需要做兼容性处理。

使用 while 循环和 some 方法

function flatten(arr) {let isNested = true;while (isNested) {isNested = false;let newArr = [];for (let i = 0; i < arr.length; i++) {if (Array.isArray(arr[i])) {newArr = newArr.concat(arr[i]);isNested = true;} else {newArr.push(arr[i]);}}arr = newArr;}return arr;
}
  • 优点:避免了递归调用,不会有栈溢出问题,在处理深度嵌套数组时性能相对稳定。
  • 缺点:代码逻辑相对复杂,需要多次遍历数组和创建新数组,在处理大规模数组时,频繁的数组操作会带来一定的性能开销。

效率总结

  • 小规模、浅嵌套数组:递归方法、reduceconcat 方法代码简洁易读,性能差异不大,可任选其一。
  • 大规模、深嵌套数组flat 方法效率最高,因为它是原生方法,经过优化;若考虑兼容性,while 循环和 some 方法是不错的选择,能避免栈溢出问题。

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

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

相关文章

麒麟操作系统安装人大金仓数据库

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 在当前数字化转型和信息安全备受重视的背景下&#xff0c;众多公司积极推进国产化改造进程。在操作系统领域&#xff0c;统信、open 欧拉、中标麒麟、银河麒麟等国产操作系统崭露头角&#xff0c;逐…

开发SAPUI5 Fiori应用并部署到SAP系统

首先新建一个项目文件夹 在VScode中打开 打开SAP Fiori&#xff08;需要先下载安装&#xff0c;参考上上一篇文章&#xff09; ,选择已添加的SAP S4 ERP系统 ,点击创建Firoi应用。 如果没有添加系统的&#xff0c;点击添加按钮&#xff0c;添加即可&#xff0c;注意&#xff…

右键添加:新建HTML模板文件

使用注册表给Windows右键添加:新建HTML文档模板的功能_注册表右键新建-CSDN博客 新建文件有了&#xff0c;但是没有引用模板文件&#xff0c;是空文件。 默认改成 htmlfile 模板成功

[极客大挑战 2019]Knife——3.20BUUCTF练习day4(1)

[极客大挑战 2019]Knife——3.20BUUCTF练习day4(1) 很简单 蚁剑连接 根目录下有flag flag{f77e8444-dd87-48b3-8fe0-a735b5a5c708}

力扣22.括号生成

22. 括号生成 - 力扣&#xff08;LeetCode&#xff09; 代码区&#xff1a; class Solution {vector<string> ans; public:vector<string> generateParenthesis(int n) {dfs(0,0,n,"");return ans;}void dfs(int left,int right,int n,string str){if(l…

第37周:文献阅读

目录 摘要 Abstract 文献阅读 问题引入 研究背景 研究意义 研究目的 实验方法 TimeGAN 数据增强 预测模型的独立性 创新点 实验研究 数据准备 合成数据分析 模型比较 总结 摘要 该文献围绕利用 TimeGAN 提高供热变电站热负荷预测精度展开。结构上&#x…

NFS 安装与测试

NFS 安装与测试 服务器 # NFS 共享目录 mkdir -p ${HOME}/Share/nfs && sudo chown -R nobody:nogroup ${HOME}/Share/nfs# 安装 NFS Server sudo apt install nfs-kernel-server# 配置 NFS 目录 sudo cp -arf /etc/exports /etc/exports.bak sudo tee -a /etc/exports…

算法题(103):数独

审题&#xff1a; 本题需要我们找出数独的解&#xff0c;并打印出来 时间复杂度分析&#xff1a; 本题是9*9的数独格子&#xff0c;所以数据量小于25&#xff0c;可以使用2^n的算法 思路&#xff1a; 方法一&#xff1a;深度优先搜索 首先确定搜索及插入策略&#xff1a; 我们采…

snmp/mib采用子代理模式,编码,部署

0.环境 0.1 编译net-snmp cd net-snmp-5.7.2 ./configure --prefix/usr/local/snmp BEGIN failed--compilation aborted at Makefile.PL line 1. make: *** [perlmakefiles] Error 2 yum install cpan -y make && make install /…

# [RPA] 使用八爪鱼进行高效网页数据采集

在许多行业中&#xff0c;数据是核心资产。然而&#xff0c;虽然许多网站的文本内容可以免费访问&#xff0c;但手动一条一条采集&#xff0c;不仅耗时耗力&#xff0c;还容易出错。这种情况下&#xff0c;使用自动化工具来提高采集效率就显得尤为重要。本文将介绍 八爪鱼 这一…

IDI_APPLICATION 与 IDC_ARROW资源存放在工程的哪个路径?

书籍&#xff1a;《windows程序设计(第五版)》的开始 环境&#xff1a;visual studio 2022 内容&#xff1a;HELLOWIN程序 说明&#xff1a;以下内容大部分来自腾讯元宝。 IDI_APPLICATION 和 IDC_ARROW 是 ​Windows 系统预定义的资源标识符&#xff0c;它们并不以文件形式…

算法 | 优化算法比较

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 优化算法 ‌一、主流优化算法分类‌1‌、传统梯度类算法‌2‌、启发式算…

腾讯云HAI1元体验:轻松调用DeepSeek-R1模型搭建网站

前言 随着云计算和人工智能技术的不断发展&#xff0c;构建和部署智能化的网页变得越来越简单。腾讯云提供的HAI&#xff08;人工智能平台&#xff09;和DeepSeek&#xff08;智能搜索引擎&#xff09;服务&#xff0c;能帮助开发者快速搭建智能化网页&#xff0c;提升用户体验…

AI Agent系列(七) -思维链(Chain of Thought,CoT)

AI Agent系列【七】 前言一、CoT技术详解1.1 CoT组成1.2 CoT的特点 二、CoT的作用三、CoT的好处四、CoT适用场景五、CoT的推理结构 前言 思维链(Chain of Thought,CoT)&#xff0c;思维链就是一系列中间的推理步骤(a series of intermediate reasoning steps)&#xff0c;通过…

【一起来学kubernetes】21、Secret使用详解

Secret 的详细介绍 Secret 是 Kubernetes 中用于存储和管理敏感信息&#xff08;如密码、令牌、密钥等&#xff09;的资源对象。Secret的设计目的是为了安全地存储和传输敏感信息&#xff0c;如密码、API密钥、证书等。这些信息通常不应该直接硬编码在配置文件或镜像中&#x…

opencv中stitch图像融合

openv版本: opencv249 vs &#xff1a;2010 qt : 4.85 #include "quanjing.h"#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <open…

1201. 【高精度练习】蜜蜂路线

题目描述 一只蜜蜂在图5.1-2所示的数字蜂房上爬动&#xff0c;已知它只能从标号小的蜂房爬到标号大的相邻蜂房&#xff0c; 现在问你&#xff1a;蜜蜂从蜂房M开始爬到蜂房N&#xff0c;l≤M 输入 M&#xff0c;N的值。 输出 一个数表示爬行路线种数。 样例输入 1 14 样…

linux下基本命令和扩展命令(安装和登录命令、文件处理命令、系统管理相关命令、网络操作命令、系统安全相关命令、其他命令)欢迎补充噢

基本命令 ls: 列出目录内容 ls&#xff1a;列出当前目录内容ls -l&#xff1a;以长格式列出&#xff08;显示详细信息&#xff09;ls -a&#xff1a;显示隐藏文件ls -lh&#xff1a;以易读格式显示文件大小 pwd: 显示当前工作目录 pwd&#xff1a;显示当前目录的绝对路径 cd:…

《C++11 基于CAS无锁操作的atomic原子类型》

count; count--; 我们知道&#xff0c;/--操作并不是原子性的&#xff0c;其实对应三条汇编指令来完成的。 读取&#xff1a;从内存中把变量的值读取到寄存器修改&#xff1a;在寄存器里将变量的值1/-1写入&#xff1a;把修改后的值写入到内存 在单线程环境下&#xff0c;这…

C++常用多线程模式

文章目录 1. Fork - Join模式2. Producer - Consumer模式3. Readers - Writers模式4. Work Thread模式5. Actor模式6、 Pipeline模式概述应用场景C实现示例代码解释 1. Fork - Join模式 原理&#xff1a;将一个大任务分解为多个子任务&#xff0c;这些子任务在不同的线程中并行…