JS-数组扁平化方法合集(递归,while循环,flat)

前言

数组扁平化也是面试常考题之一,今天就和大家简单分享一下常见的数组扁平方法。这题其实主要考察的是递归思想,因为当数组里面嵌套非常多层数组的时候只能通过循环递归来进行扁平。本次分享主要也是分享本题的递归思想。话不多说,开始分享!

flat() 方法

第一个方法那必须是js自带的方法,flat 是 JavaScript 中 Array 对象的一个方法,它用于将多维数组扁平化,即把一个嵌套多层的数组转换为只有一层的数组。这个方法是在 ECMAScript 2019 (ES10) 中引入的。

flat 方法可以接受一个可选的参数 depth,用来指定扁平化的深度。

  • 不传参数或传 1 时,默认扁平化第一层嵌套数组。
  • 传入数字 n 表示将数组扁平化到第 n 层深度。
  • 如果传入 Infinity 作为参数,那么不管嵌套多深,都会被扁平化为一维数组。

下面是一些示例

let arr = [1,[2,[3,[4,5]]]];
// 只会扁平化一层
console.log(arr.flat(1));//[1,2,[3,[4,5]]]
// 扁平化两层
console.log(arr.flat(2));//[1,2,3,[4,5]]
// 全部扁平化
console.log(arr.flat(Infinity));//[1,2,3,4,5]

toString()方法

一个冷知识,数组的toString方法会把元素以逗号分隔,意思是无论你嵌套多少层,toString方法都能给你变成逗号分隔,刚好满足我们的要求扁平数组。

let arr = [1,[2,[3,[4,5]]]];
//toString方法变成字符串
console.log(arr.toString());//'1,2,3,4,5'
arr = arr.toString().split(",").map(function (item){return +item;
})

递归

这里简单介绍一下思路,当你遇到一个并不知到范围的数据(不知道嵌套了多少层的数组),只能使用循环或者是递归来进行所有范围的遍历,其中虽然递归相对循环性能较差因为要不断创建上下文入执行栈。但是不得不说递归真是太酷啦!

纯手写递归

let arr = [1,[2,[3,[4,5]]]];
function flatten(arr) {//创建一个数组,接受扁平化的数组let result = [];for(let i=0,len=arr.length;i<len;i++){// 如果子元素是数组if(Array.isArray(arr[i])){// 将 子元素扁平之后加入到结果数组里面result = result.concat(flatten(arr[i]));}else{// 子元素不是数组就直接添加result.push(arr[i]);}}return result;
}
console.log(flatten(arr));//[1,2,3,4,5]

reduce方法进行递归(代码较少)

这里怕有些小伙伴不知道reduce的用法这里简单介绍一下。
reduce函数会遍历每一个元素,每次遍历都会执行一个回调函数,该函数有两个参数,一个是上一次回调函数返回的值,还有一个参数就是当前元素的值。可以给初始值,不给的话就默认初始值为第一个元素,然后从第二个元素开始遍历。最后返回最后一次回调函数返回的值。下面是reduce的简单案例

let arr = [1,2];
console.log(arr.reduce((sum,nowVal)=>sum+nowVal))//    3
console.log(arr.reduce((sum,nowVal)=>sum+nowVal,4))//  4

简单了解reduce之后我们就来开始递归扁平数组

let arr = [1,[2,[3,[4,5]]]];
function flatten(arr){// 和普通递归相同,这里只不过是缩减了代码,思想一致return arr.reduce((result,nowValue)=>Array.isArray(nowValue)?result.concat(flatten(nowValue)):result.concat(nowValue),[]);
}
console.log(flatten(arr));// [1,2,3,4,5]

while循环

虽然递归真的很好用,但是还是要介绍一下循环。本文运用到了数组的结构方法,JavaScript中的解构是一种允许您从数组或对象中提取数据并将其分配给变量的表达式。这种特性是ES6(ECMAScript 2015)引入的,极大地提高了代码的简洁性和可读性。
这里也是简单举个例子:

let arr = [1,2,3,[4,5]];
let [first,...rest]=arr;//first就是1,这里的rest就会存储剩下的元素[2,3,[4,5]]

那么接下来就是数组扁平啦!

let arr = [1,[2,[3,[4,5]]]];
function flatten(arr){let result = [];while(arr.length!=0){// 将arr的第一个元素取出,剩下的存入rest数组中let [first,...rest] = arr;if(Array.isArray(first)){//如果是数组,那么就将first进行解构将里面的元素逐一添加到arr中,//相当于将first里面的元素降了一个层级,rest必须进行解构添加// 否则将会将rest里面的元素层级提升arr = [...first,...rest];}else{//如果第一个元素不是数组,就添加到结果数组中result.push(first);//这里相当与将第一个元素剔除,下次遍历取rest数组第一个元素arr =[...rest];}}return result;
}
console.log(flatten(arr));// [1,2,3,4,5]

结语

讲实话这里面除了js自带的方法flat,其他的我最喜欢的就是纯递归解决方案了。其他的都多余了(其实就是简化一些代码)好啦,本次分享就到这里了。喜欢的话就点个关注或者是赞吧。谢谢您啦- ̗̀(๑ᵔ⌔ᵔ๑)。

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

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

相关文章

基于Spring Boot构建淘客返利平台

基于Spring Boot构建淘客返利平台 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将讨论如何基于Spring Boot构建一个淘客返利平台。 淘客返利平台通过…

计算机网络地址划分A-E(自学)

1、网络地址组成 &#xff08;1&#xff09;物理地址MAC&#xff08;Media Access Control Address&#xff09; 网卡生产商分配&#xff0c;全球唯一&#xff0c;48/64位二进制 &#xff08;2&#xff09;逻辑地址IP(Internet Protocol) 网络层地址&#xff0c;用于在不同网…

Handling `nil` Values in `NSDictionary` in Objective-C

Handling nil Values in NSDictionary in Objective-C When working with Objective-C, particularly when dealing with data returned from a server, it’s crucial (至关重要的) to handle nil values appropriately (适当地) to prevent unexpected crashes. Here, we ex…

VBA递归过程快速组合数据

实例需求&#xff1a;数据表包含的列数不固定&#xff0c;有的列&#xff08;数量和位置不固定&#xff09;包含组合数据&#xff0c;例如C2单元格为D,P&#xff0c;说明Unit Config有两种分别为D和P&#xff0c;如下图所示。 现在需要将所有的组合罗列出来&#xff0c;如下所示…

git上传本地项目及更新项目

1、注册GitHub账号和下载git 2、在GitHub上新建一个仓库&#xff0c;点击号——>New repository&#xff0c;给仓库起一个名字&#xff0c;点击Create repository 3、进入要上传的项目中&#xff0c;右键点击git back here&#xff0c;命令行输入git init初始化&#xff0c…

19、复杂链表的复制?、 二叉搜索树与双向链表

题目&#xff1a; 复杂链表的复制&#xff1f; 描述&#xff1a; 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c; 另一个特殊指针指向任意一个节点&#xff09;&#xff0c;返回结果为复制后复杂链表的h…

全球电力电子测试方案专业提供商「艾诺仪器」×企企通召开项目启动会,推进企业采购数智化升级

导读 供应链管理已成为企业的核心竞争力之一&#xff0c;为应对快速变化的市场环境&#xff0c;艾诺仪器亟需强化采购管理和供应链协同的竞争力。SRM涉及到各事业部、各所属企业等多个层面&#xff0c;希望通过双方优势资源的整合&#xff0c;打造高效协同、科学智能的数字化采…

第十三站:Java蓝宝石——云计算的浩瀚天空

Java作为一门成熟且广泛使用的编程语言&#xff0c;在云计算领域扮演着重要的角色。以下是对Java在云计算领域应用的详细讲解&#xff1a; 云服务提供商的Java SDK: Amazon Web Services (AWS): 提供了AWS SDK for Java&#xff0c;允许开发者在Java应用程序中轻松集成AWS服务&…

数据挖掘概览

数据挖掘(Data Mining)就是从大量的,不完全的,有噪声的,模糊的,随机的实际应用数据中,提取隐含在其中的,人们事先不知道的,但又是潜在有用的信息和知识的过程. 预测性数据挖掘 分类 定义&#xff1a;分类就是把一些新的数据项映射到给定类别中的某一个类别 分类流程&#x…

深入理解Java集合框架:使用与实现

深入理解Java集合框架:使用与实现 引言 集合框架是Java语言的重要组成部分,提供了用于存储和操作数据的各种集合类和接口。无论是数组、列表、集合还是映射,Java集合框架都为开发者提供了丰富的工具和灵活的解决方案。在本篇文章中,我们将深入探讨Java集合框架的基本概念…

Python | Leetcode Python题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; def reverse(nums: List[int], left, right) -> None:i, j left, rightwhile i < j:nums[i], nums[j] nums[j], nums[i]i1j-1 class Solution:def rotate(self, nums: List[int], k: int) -> None:n len(nums)k % nreverse(num…

Midway + TypeORM项目部署到BT后启动失败,MySQL报错

Midway TypeORM项目部署到BT后启动失败&#xff0c;MySQL报错 前沿 您需要先了解这篇文章&#xff1a;https://blog.csdn.net/weixin_45687201/article/details/139336111 错误日志 服务状态开启后就失败项目日志&#xff0c;输出 \> my-midway-project1.0.0 start \&…

python练习题—传染问题(治愈)

传染(infect)某种传染病第一天只有一个患者&#xff0c;前五天为潜伏期&#xff0c;不发作也不会传染人第6天开始发作&#xff0c;从发作到治愈需要5天时间&#xff0c;期间每天传3个人 求第N天共有多少患者 思路&#xff1a; 开始时认为可以进行判断五天或者五天十天后进行计算…

[modern c++][11] 非类型模板参数

前言&#xff1a; 我们再使用 std::get 的时候发现其模板并不是一个类型&#xff0c;而是一个整数值&#xff0c;用来标识从某个位置获取值&#xff0c;比如 std::pair 类型的数据 tmppair&#xff0c;那么就可以通过 std::get<0>(tmppair)来获取key的值&#xff0c;通过…

【Python新手入门指南】Linux-conda环境安装与使用参考

文章目录 前言一、conda是什么&#xff1f;二、安装步骤三、使用Conda来管理Python环境1. 创建环境2. 激活环境3. 安装软件包4. 查看环境5. 删除环境&#xff1a;如果您不再需要某个环境&#xff0c;可以使用以下命令将其删除&#xff1a; 前言 如果你是一位经验丰富的Python开…

oracle merge的使用

Oracle中的MERGE语句是一个非常强大的工具&#xff0c;它允许用户在一个SQL语句中同时执行INSERT和UPDATE操作。以下是关于Oracle MERGE语句的详细使用说明&#xff1a; 1. 基本语法 MERGE INTO target_table USING source_table ON (merge_condition) WHEN MATCHED THEN …

【SQL Server数据库】熟悉DBMS的基本操作及数据库的创建

目录 一、SQL SERVER基本操作 二、用Management Studio创建数据库 1、使用Management Studio创建数据库bookdb&#xff0c;各项参数采用默认设置。 2、使用Management Studio创建数据库EDUC 3. 在EDUC中创建三个表&#xff0c;根据下面要求创建Student&#xff0c;Course&am…

昇思25天学习打卡营第01天|基本介绍快速入门

一、什么是昇思MindSpore&#xff1f; 昇思MindSpore是一个全场景深度学习框架&#xff0c;详见基本介绍 那什么是深度学习呢&#xff1f; 深度学习是一种特殊的机器学习&#xff0c;主要是利用了多层神经网络模拟人脑&#xff0c;自动提取特征并进行预测。 什么是机器学习…

Mac Terminal常用命令

1. 文件和目录操作&#xff1a; #ls : 列出当前目录下的文件和子目录 -- ls(list) #cd : 进入指定目录。 -- cd Documents。 cd(change directory)cd ..:返回上一级cd ~:返回家目录cd /:返回根目录 cd Documents/ 前往“文稿” #pwd : 显示当前工作目录的完整路径 -- pwd(prin…

【C++】模板详解

前言&#xff1a;在之前的学习我们发现我们无时无刻都用到模板这个东西&#xff0c;但是博主一直没有进行讲解&#xff0c;今天我们就一次性对模板进行一个整体的学习与讲解。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#…