数组扁平化的方法

什么是“数组扁平化”
用简单的话来说,就是将一个多维数组变为一个一维数组。例如,将数组[1, 2, [3, [4, 5]], [6, 7]]扁平化处理后输出[1, 2, 3, 4, 5, 6, 7]。

实现“数组扁平化”方法
方式1:使用基础的递归遍历

声明一个函数,遍历数组的每个元素,判断当前元素是否仍是数组,是的话递归执行这个函数,并把执行结果与当前结果数组合并,不是数组则直接将当前元素push到结果数组中。

function flatten(arr) {
  let result = [];
  // 此处也可使用for...of遍历
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      result = result.concat(flatten(arr[i]));
    } else {
      result.push(arr[i]);
    }
  }
  return result;
}
 

方式2:使用reduce函数递归遍历 

与第一种方法思路是一样的,区别在于这里利用reduce函数的特性遍历数组并保存每一次的计算结果。

function flatten(arr) {
  return arr.reduce((pre, current) => {
    if (Array.isArray(current)) {
      return pre.concat(flatten(current));
    } else {
      return pre.concat(current);
    }
  }, []);
},


方式3:数组强制类型转换

对于数组对象,toString方法连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素。返回的字符串使用split分割成子字符串数组,最后将数组中每个元素的类型转换为Number型。

function flatten(arr) {
  return arr.toString().split(',').map((item) => Number(item));
},
 

 为了方便理解,在浏览器调试工具的Console下逐步执行各个步骤,每步的输出结果如下图所示。

 

方式4:while循环结合findIndex与concat

在while循环中,使用findIndex判断当前数组是否是一个多维数组(即判断数组是否存在Array类型的元素),如是,则使用…扩展操作符展开作为concat方法的参数进行合并(如下图)并赋值给当前数组,再执行下一次循环的条件判断,直至得到一个一维数组。

function flatten(arr) {
  while (arr.findIndex((item) => Array.isArray(item)) > 0) {
    arr = [].concat(...arr);
  }
  return arr;
}

 

可能有些小伙伴不太能理解 arr = [].concat(...arr);这一行代码,其实这一行代码的作用就相当于把所给多维数组剥开一层(如下图所示),多次循环执行直至得到一个一维数组。 

方式5:直接使用ES6的flat方法

直接使用ES6提供的flat方法实现扁平化。falt()方法会按照指定的深度递归遍历数组,arr.flat([depth]),参数depth不填时默认值为1,depth为Infinity表示展开任意深度的嵌套数组。

function flatten(arr) {
  return arr.flat(Infinity);
}


方式6:使用JSON的函数和正则表达式

使用JSON的序列化函数stringify()先对数组进行序列化,再用正则去掉[],得到的结果在最外层加上[]后使用JSON.parse()恢复成数组对象。

function flatten(arr) {
  let result = JSON.stringify(arr).replace(/(\[|\])/g,'');
  result = '[' + result + ']';
  return JSON.parse(result);
}
 

 


方式7:使用堆栈stack

创建一个栈结构和一个存放结果的空数组,然后遍历栈结构,判断元素如果是数组就使用扩展操作符展开再次入栈,不是就添加到结果数组的开头。

// 无递归数组扁平化
function flatten(arr) {
  const stack = [...arr];
  const res = [];
  while (stack.length) {
    // 出栈 从 stack 中取出一个元素
    const next = stack.pop();
    if (Array.isArray(next)) {
      // 展开一层重新入栈
      stack.push(...next);
    } else {
      res.unshift(next);
    }
  }
  return res;
}



方式8:使用Generator 函数与递归结合

Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。思路还是遍历当前数组,判断数组元素是否是数组,是则使用 yield 语句递归执行这个 Generator 函数,不是则使用 yield 表达式返回当前值。

function* flatten(arr){
  for(const item of arr) {
    if(Array.isArray(item)) {
      yield* flatten(item);
    } else {
      yield item;
    }
  }
}
const array = [1, 2, [3, [4, 5]], [6, 7]];
const flattened = [...flatten(array)];

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

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

相关文章

《Linux操作系统实战》| 面试了两个实习生,Linux 基本命令都不会(一)

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

python进程和线程(05)

python进程和线程(05) 文章目录 python进程和线程(05)1 python进程和线程1.1 进程和线程概念1.2 并行执行1.3 核心使用语法_threading模块1.4 多线程编程1.4.1 案例单线程不能满足情况如下&#xff1a;1.4.2 多线程1.4.2.1 多线程创建语句1.4.2.2 案例 1.4.2 多线程传参使用1.4…

基于微信小程序的小区服务管理系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

【算法基础】数学知识

质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…

【数据库系统概论】数据库的四个基本概念:数据、数据库、数据库管理系统和数据库系统

数据&#xff08;data&#xff09;数据库&#xff08;DataBase, DB&#xff09;数据库管理系统&#xff08;DataBase Management System, DBMS&#xff09;数据库系统&#xff08;DataBase System, DBS&#xff09;感谢 &#x1f496; 数据&#xff08;data&#xff09; 定义&…

JavaScript小案例-树形菜单(菜单数据为数组)

菜单层级理论上可以无限多&#xff0c;因为是递归渲染。 gif演示图&#xff1a; 代码&#xff1a; 树形菜单.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&quo…

spring boot项目一次性能测试的总结

满足标准&#xff1a;并发大于等于100 &#xff0c;平均响应时间小于等于3秒 项目在压测过程中并发数只有50&#xff0c;在并发数100的情况下有很多请求链接是失败的 我们该如何入手去处理这些问题并提高并发数呢&#xff1f; 1、首先从压测结果入手&#xff0c;对不满足标准…

7.algorithm2e中while怎么使用

algorithm2e中while怎么使用 在 algorithm2e 宏包中&#xff0c;要使用 while 循环&#xff0c;您可以使用 \While 和 \EndWhile 命令来定义循环的开始和结束。以下是如何使用 while 循环的示例&#xff1a; \documentclass{article} \usepackage[linesnumbered,boxed]{algorit…

GMAC PHY介绍

1.1PHY接口发展 &#xff08;1&#xff09;MII支持10M/100Mbps&#xff0c;一个接口由14根线组成&#xff0c;它的支持还是比较灵活的&#xff0c;但是有一个缺点是因为它一个端口用的信号线太多。参考芯片&#xff1a;DP83848 、DM900A&#xff08;该芯片内部集成了MAC和PHY接…

nginx配置gzip压缩,优化传输效率,加快页面访问速度

文章目录 引言一、什么是nginx的gzip二、nginx的常用配置项三、使用示例四、浏览器查看gzip是否生效1. 判断浏览器是否支持gzip2. 判断gzip是否生效 总结 引言 在现代互联网的高速发展进程中&#xff0c;网站的访问速度愈发成为了用户选择和留存的关键。其中&#xff0c;通过g…

python小程序 图书馆图书借阅借还管理系统 mbc21

为设计一个安全便捷&#xff0c;并且使借阅者更好获取本图书借还信息&#xff0c;本文主要有安全、简洁为理念&#xff0c;实现借阅者快捷寻找图书借还信息&#xff0c;从而解决图书借还信息复杂难辨的问题。该系统以django架构技术为基础&#xff0c;采用python语言和MySQL数据…

如何从外网远程控制企业内网电脑?

在企业中&#xff0c;保护公司机密和数据安全是至关重要的。为了确保员工在使用公司电脑时遵守相关规定&#xff0c;许多公司会采取外网监控员工电脑的方法。本文将介绍一些真实有效的方法和具体的操作步骤&#xff0c;以帮助您更好地监控员工电脑。 一、什么是外网监控&#x…

Android 中集成 TensorFlow Lite图片识别

在上图通过手机的相机拍摄到的物体识别出具体的名称&#xff0c;这个需要通过TensorFlow 训练的模型引用到项目中&#xff1b;以下就是详细地集成 TensorFlow步骤&#xff0c;请按照以下步骤进行操作&#xff1a; 在项目的根目录下的 build.gradle 文件中添加 TensorFlow 的 Ma…

GitStats - 统计Git所有提交记录工具

如果你是研发效能组的一员或者在从事 CI/CD 或 DevOps&#xff0c;除了提供基础设施&#xff0c;指标和数据是也是一个很重要的一环&#xff0c;比如需要分析下某个 Git 仓库代码提交情况&#xff1a; 该仓库的代码谁提交的代码最多 该仓库的活跃度是什么样子的 各个时段的提交…

视频去LOGO的方法,AI自动完美地去除视频LOGO

喜欢做影视剧剪辑的朋友&#xff0c;可能会遇到下载的影视剧本身存在字幕、台标的情况&#xff0c;这些和新的剪辑主题不相符的原片元素&#xff0c;都会影响我们最终的成片效果。不过也无需烦恼哦&#xff0c;我们可以利用AI视频处理工具&#xff0c;自动去除视频中的logo或其…

数据结构-leetcode-移除元素

int removeElement(int* nums, int numsSize, int val){int start0;int end0;int flag0;for(int i 0;i<numsSize;i){if(nums[end]val){end;flag;}else if(nums[end]!val){nums[start]nums[end];end;start;}}return numsSize-flag; } 注&#xff1a;时间复杂度为O(N)&#xf…

Unity——对象池

对象池是一种朴素的优化思想。在遇到需要大量创建和销毁同类物体的情景时&#xff0c;可以考虑使用对象池技术优化游戏性能。 一、为什么要使用对象池 在很多类型的游戏中都会创建和销毁大量同样类型的物体。例如&#xff0c;飞行射击游戏中有大量子弹&#xff0c;某些动作游戏…

ClickHouse面向列的数据库管理系统(原理简略理解)

目录 官网 什么是Clickhouse 什么是OLAP 面向列的数据库与面向行的数据库 特点 为什么面向列的数据库在OLAP场景中工作得更好 为什么ClickHouse这么快 真实的处理分析查询 OLAP场景的关键属性 引擎作用 ClickHouse引擎 输入/输出 CPU 官网 https://clickhouse.com…

【人工智能】企业如何使用 AI与人工智能的定义、研究价值、发展阶段的深刻讨论

前言 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 &#x1f4d5;作者简介&#x…

PLC串口通讯和通讯接口知识汇总

在使用PLC的时候会接触到很多的通讯协议以及通讯接口&#xff0c;最基本的PLC串口通讯和基本的通讯接口你都了解吗&#xff1f; 一、什么是串口通讯&#xff1f; 串口是一种接口标准&#xff0c;是计算机上一种非常通用设备通信的协议。它规定了接口的电气标准&#xff0c;没…