数组扁平化 JS代码实现 + 常用数组方法(未完)

文章目录

  • 数组扁平化
    • 定义
    • (1) ES6的flat方法
    • (2) 使用正则
      • JSON.stringify & parse
    • (3) 使用递归
    • (4) 使用 reduce(不太明白)
    • (5) 使用栈的思想实现 flat 函数
  • ES6数组的常用方法

数组扁平化

定义

在JavaScript中,数组扁平化(Array Flattening)是指将一个多维数组(即数组内部还包含数组)转换为一维数组的过程。简单来说,就是将一个嵌套数组展开成单个层级的数组。

  • 举例
let nestedArray = [1, [2, [3, 4], 5], 6];扁平化之后:
[1, 2, 3, 4, 5, 6]

(1) ES6的flat方法

数组自带的扁平化方法,flat的参数代表的是需要展开几层,如果是Infinity的话,就是不管嵌套几层,全部都展开

const arr = [1,[2,[3,[4,5]]],6]
//  方法一:数组自带的扁平化方法,flat的参数代表的是需要展开几层,如果是Infinity的话,就是不管嵌套几层,全部都展开
console.log(arr.flat(Infinity))

(2) 使用正则

  1. 首先是使用 JSON.stringify 把 arr 转为字符串
  2. 接着使用正则把字符串里面的 [ 和 ] 去掉
  3. 然后再拼接数组括号转为数组对象
const arr = [1,[2,[3,[4,5]]],9]
const res = JSON.stringify(arr).replace(/\[|\]/g,'')
const res2 = JSON.parse('[' + res + ']')
console.log(res2)

JSON.stringify & parse

JSON.stringify() 方法将一个 JavaScript 值(对象、数组、字符串、数字、布尔值等)转换成一个 JSON 字符串。如果该值无法被序列化,那么 JSON.stringify() 会抛出一个错误。

let obj = {name: "Kimi",age: 30,isAdmin: true
};let jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出:{"name":"Kimi","age":30,"isAdmin":true}

(3) 使用递归

const array = [] //存储扁平化后的元素
const  fn = (arr)=>{for(let i = 0;i<arr.length; i++){if(Array.isArray(arr[i])){ //函数检查当前索引 i 处的元素是否是一个数组fn(arr[i]) //函数会重复执行,直到遇到非数组元素。}else {array.push(arr[i])}}
}
fn(arr)
console.log(array)

(4) 使用 reduce(不太明白)

const newArr = (arr)=>{return arr.reduce((pre,cur)=>{return pre.concat(Array.isArray(cur) ? newArr(cur) : cur)},[])}
console.log(newArr(arr),"reduce方法")

return arr.reduce((pre, cur) => {

reduce 方法的第一个参数是一个回调函数,这个回调函数有两个参数:precurpre 是累加器的值,即上一次回调函数返回的结果;cur 是当前正在处理的数组元素。

return pre.concat(Array.isArray(cur) ? newArr(cur) : cur)

这是 reduce 方法回调函数的主体部分。它首先检查当前元素 cur 是否是一个数组。如果是数组,那么递归调用 newArr 函数来处理这个子数组,并将结果与 pre 进行 concat 操作,即合并两个数组。如果不是数组,就直接将 curpre 进行 concat 操作。

(5) 使用栈的思想实现 flat 函数

// 栈思想
function flat(arr) {const newArr = [];const stack = [].concat(arr);  // 将数组元素拷贝至栈,直接赋值会改变原数组//如果栈不为空,则循环遍历while (stack.length !== 0) {const val = stack.pop(); // 删除数组最后一个元素,并获取它if (Array.isArray(val)) {stack.push(...val); // 如果是数组再次入栈,并且展开了一层} else {newArr.unshift(val); // 如果不是数组就将其取出来放入结果数组中}}return newArr;
}let arr = [12, 23, [34, 56, [78, 90, 100, [110, 120, 130, 140]]]];
console.log(flat(arr));
// [12, 23, 34, 56, 78, 90, 100, 110, 120, 130, 140]作者:LeetCode
链接:https://leetcode.cn/leetbook/read/interview-coding-frontend/dqaprj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ES6数组的常用方法

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

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

相关文章

Cpp::STL—容器适配器Stack和Queue的讲解和模拟实现(15)

文章目录 前言一、适配器模式概念分类 二、Stack核心作用代码实现 三、Queue核心作用代码实现 四、deque双端队列貌似兼收并蓄&#xff1f;实则也难以兼得~ 总结 前言 适配器也是STL六大组件之一&#xff0c;请跟我一起领悟它的智慧&#xff01;   正文开始&#xff01; 一、…

consumer 角度讲一下i2c外设

往期内容 I2C子系统专栏&#xff1a; I2C&#xff08;IIC&#xff09;协议讲解-CSDN博客SMBus 协议详解-CSDN博客I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg-CSDN博客内核提供的通用I2C设备驱动I2c-dev.c分析&#xff1a;注册篇内核提供的通用I2C设备驱动I2C-dev.…

浅析建造者模式

建造者模式 一、基础知识介绍 1. 问题引出 上图面存在的问题&#xff1a;产品和产品创建的过程是封装在一起的。耦合性太强 解决方法: 将二者解耦和 2.建造者模式介绍 将复杂对象的构造过程抽象出来&#xff0c;用户不用知晓里面的构建细节 3.四个角色 建造者模式的四个角…

Java项目-基于springboot框架的财务管理系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

【element-tiptap】如何修改选中内容时的背景颜色?

前言&#xff1a;element-tiptap 用鼠标选中内容的时候&#xff0c;背景颜色跟系统设置的主题有关&#xff0c;比如的我的就是卡哇伊的pink&#xff0c;默认是淡蓝色 但是我们观察一下语雀&#xff0c;背景颜色是它规定好的颜色 这篇文章来探索一下&#xff0c;怎么自己规定选…

实操上手TinyEngine低代码引擎插件化开发

1.背景介绍 1.1 TinyEngine 低代码引擎简介 低代码开发是近些年非常热门的一种开发方式&#xff0c;用户可以通过可视化的方式&#xff0c;简单拖拽&#xff0c;不写代码或者编写少量代码&#xff0c;类似搭积木一样搭建业务应用。 TinyEngine是一个强大的低代码引擎&#x…

企业博客SEO优化:8个必备工具与资源指南

在当今数字化时代&#xff0c;企业博客已远远超越了传统意义上的信息展示平台。它不仅是企业展示品牌形象、传递品牌价值的重要窗口&#xff0c;更是吸引潜在客户、增强用户粘性、提升网站流量和搜索引擎排名的关键。通过精心策划和高质量的内容创作&#xff0c;企业博客能够建…

ChatGPT4o、o1 谁才是最佳大模型?

如何选择合适的 ChatGPT 模型&#xff1f;OpenAI 更新细节与 GPTs 的深入解析 随着人工智能的发展&#xff0c;ChatGPT 已成为众多用户的强大助手&#xff0c;广泛应用于写作、编程、学习和商业等多个领域。然而&#xff0c;面对 OpenAI 提供的众多模型&#xff08;如 GPT-4、…

idea中,git提交时忽略某些本地修改.将文件从git暂存区移除

我们有时候在本地调试代码时&#xff0c;某些配置文件需要修改成本地环境中。当改完后&#xff0c;需要提交代码时&#xff0c;这些文件又不能推到git上。如下图&#xff1a; 当出现这种情况&#xff0c;我们每次都需要手动去将不需要提交的文件的对号去掉。文件多了后&#x…

[Redis] 在Linux中安装Redis并连接图形化工具详细过程(附下载链接)

前言 安装Redis之前应该在虚拟机中安装Linux系统&#xff0c;这里使用centos7版本 [linux] 在VMware中安装linux、文件下载及详细安装过程&#xff08;附下载链接&#xff09;-CSDN博客 安装Linux后&#xff0c;更换yum源为阿里云并安装gcc依赖 [Linux] CentOS7替换yum源为阿…

Rust 语言持续崛起,即将冲击 TIOBE 指数前十,能否成为编程语言新王者?

Rust 语言持续崛起&#xff0c;即将冲击 TIOBE 指数前十&#xff0c;能否成为编程语言新王者&#xff1f; 2024 年 10 月&#xff0c;全球编程语言 TIOBE 排行榜再次更新&#xff0c;各大编程语言在各自领域中继续发挥着独特的优势。官方的标题是&#xff1a; Rust排名稳步攀升…

【代码随想录Day47】单调栈Part02

42. 接雨水 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;单调栈&#xff0c;经典来袭&#xff01;LeetCode:42.接雨水_哔哩哔哩_bilibili 思路概述 问题理解&#xff1a;我们需要计算在给定柱子高度之间可以接住的雨水总量。雨水的量取决于柱子的高度和它们…

PP-ChatOCRv3—文档场景信息抽取v3产线使用教程

文档场景信息抽取v3产线使用教程 1. 文档场景信息抽取v3产线介绍 文档场景信息抽取v3&#xff08;PP-ChatOCRv3&#xff09;是飞桨特色的文档和图像智能分析解决方案&#xff0c;结合了 LLM 和 OCR 技术&#xff0c;一站式解决版面分析、生僻字、多页 pdf、表格、印章识别等常…

有同学问:拿到大厂JAVA OFFER,但是会不会不稳定,有失业风险?!

昨天在直播里面有一个同学说拿到了大厂的offer&#xff0c;但是最近看了很多很多的报道&#xff0c;说大厂Java会不会也失业&#xff1f; 前两天也有家长私信咨询说孩子去了外企&#xff0c;拿着23K的工资&#xff0c;会不会也不稳定&#xff1f; 现在很多同学看了新闻报道或…

热门解压短视频素材资源网站推荐

解压短视频素材哪里找&#xff1f;今天我们来盘点一些优质的解压短视频素材下载平台。如果你也在寻找热门解压视频素材&#xff0c;这份资源清单一定能帮到你&#xff5e; 蛙学网 蛙学网是国内领先的视频素材网站&#xff0c;涵盖了各种类型的解压视频资源&#xff0c;如手艺制…

【专题】计算机网络之物理层

计算机网络体系结构&#xff1a; 1. 物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 作用&#xff1a;尽可能屏蔽掉不同传输媒体和通信手段的差异。 用于物理层的协议也常称为物理层规程 (procedu…

【HarmonyOS NEXT】实现保存base64图片到图库

上篇文章介绍了HarmonyOS NEXT如何保存base64文件到download目录下&#xff0c;本次介绍如何保存base64图片到图库&#xff0c;网络图片保存方式大同小异&#xff0c;先下载图片&#xff0c;然后再保存 phAccessHelper.showAssetsCreationDialog参考官方文档’ ohos.file.pho…

利用透视变换实现文档矫正功能

透视变换是将成像投影到一个新的平面上&#xff0c;也称作投影映射。OpenCV通过函数cv2.getPerspectiveTransorm(pos1,pos2)构造矩阵M&#xff0c;其中pos1和pos2分别表示变换前后4个点的对应位置。得到M后再通过函数cv2.warpPerspective(src,M,(cols,rows))进行透视变换。 函数…

Threejs 实现3D 地图(02)创建3d 地图

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" 地图数据来源&#xff1a; DataV.GeoAtlas地理小工具系列 <script setup> import {onMounted, ref} from vue import * as THREE from three im…

空间单细胞转录组cell2location分析流程学习

Cell2location 是一个用于空间转录组学数据分析的工具。它是一个基于贝叶斯统计模型的Python包&#xff0c;旨在利用空间转录组数据和单细胞转录组数据来进行细胞类型的空间解构。通过将单细胞转录组数据中的细胞类型信息投射到空间转录组数据中&#xff0c;Cell2location 可以…