当前位置: 首页 > news >正文

【前端】面试八股文——数组扁平化的实现

【前端】面试八股文——数组扁平化的实现

数组扁平化是指将一个多维数组转换为一维数组。在前端开发中,处理这样的数组结构是很常见的需求。本文将详细介绍几种实现数组扁平化的方法,以帮助读者更好地理解和应用这些技术。

1. 使用 Array.prototype.flat()

这是 ES6 中新增的一个方法, flat() 可以按指定深度递归地扁平化数组。参数 depth 是扁平化的层级深度,默认值为 1。当需要扁平化所有层级时,可以传入 Infinity

const arr = [1, [2, [3, [4]], 5]];
const flatArr = arr.flat(Infinity); // Infinity 确保扁平到最深一级
console.log(flatArr); // [1, 2, 3, 4, 5]

优点:

  • 语法简洁,易于理解和使用。
  • 原生方法性能较好。

缺点:

  • 仅适用于支持 ES6 的环境。

2. 使用递归

递归是一种经典的算法思想,可以通过递归调用函数来手动实现数组的扁平化。

function flatten(arr) {let result = [];arr.forEach((item) => {if (Array.isArray(item)) {result = result.concat(flatten(item));} else {result.push(item);}});return result;
}const arr = [1, [2, [3, [4]], 5]];
const flatArr = flatten(arr);
console.log(flatArr); // [1, 2, 3, 4, 5]

优点:

  • 理解递归函数后,代码逻辑清晰。

缺点:

  • 对于非常深的嵌套数组,可能会导致栈溢出。

3. 使用栈

可以利用栈结构来实现非递归的数组扁平化,从而避免递归的缺点。

function flatten(arr) {let result = [];let stack = [...arr];while (stack.length) {let next = stack.pop();if (Array.isArray(next)) {stack.push(...next);} else {result.unshift(next); // 使用 unshift 维持顺序}}return result;
}const arr = [1, [2, [3, [4]], 5]];
const flatArr = flatten(arr);
console.log(flatArr); // [1, 2, 3, 4, 5]

优点:

  • 避免递归的栈溢出问题。

缺点:

  • 可能在用于特别深的数组时,性能不如递归。

4. 使用 reduce

Array.prototype.reduce() 方法可以逐个元素地处理数组,简化数组的扁平化过程。

function flatten(arr) {return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []);
}const arr = [1, [2, [3, [4]], 5]];
const flatArr = flatten(arr);
console.log(flatArr); // [1, 2, 3, 4, 5]

优点:

  • 代码简洁,支持递归扁平化。

缺点:

  • 仍然存在递归调用的问题,可能在深度很深时导致栈溢出。

5. 使用生成器 (Generators)

生成器是 ES6 中引入的一种新特性,可以用于实现懒加载(即在需要时才生成元素),生成器函数能使数组扁平化逻辑更加直观。

function* flattenGen(arr) {for (let item of arr) {if (Array.isArray(item)) {yield* flattenGen(item);} else {yield item;}}
}const arr = [1, [2, [3, [4]], 5]];
const flatArr = [...flattenGen(arr)];
console.log(flatArr); // [1, 2, 3, 4, 5]

优点:

  • 使用生成器的懒加载特性,处理大数组时效率更高。

缺点:

  • 生成器的语法和概念可能对初学者不太友好。
  • 并不是所有环境都支持生成器。

小结

以上五种方法各有优劣,具体选择哪种方法要依据开发需求、浏览器兼容性以及性能等因素来决定:

  • Array.prototype.flat():适用于现代浏览器,语法简洁。
  • 递归:逻辑清晰,但要注意栈溢出的问题。
  • :避免递归,适用于特别深的数组,但可能性能较差。
  • reduce:简洁优雅,但亦存在递归问题。
  • 生成器:适用于大数据处理,但相对复杂。

根据项目的实际需求,选择最合适的方法来实现数组的扁平化,可以有效提升代码效率和可维护性。

相关文章:

【前端】面试八股文——数组扁平化的实现

【前端】面试八股文——数组扁平化的实现 数组扁平化是指将一个多维数组转换为一维数组。在前端开发中,处理这样的数组结构是很常见的需求。本文将详细介绍几种实现数组扁平化的方法,以帮助读者更好地理解和应用这些技术。 1. 使用 Array.prototype.fl…...

2005-2022年各省全体居民人均可支配收入数据(无缺失)

2005-2022年各省全体居民人均可支配收入数据(无缺失) 1、时间:2005-2022年 2、来源:国家统计局、统计年鉴 3、指标:全体居民人均可支配收入 4、范围:31省 5、缺失情况:无缺失 6、指标解释…...

JVM调优,何时调优,怎么调优,面试的时候调优

一般Java面试的时候,面试官都喜欢问一个面试题,就是JVM调优的面试题,相信超过99%的小伙伴都没有过JVM调优的经历。说实话,我以前也没有相关的调优经验,也非常喜欢百度,这个问题到底想问什么,应该…...

朗之万动力学(Langevin dynamics)

朗之万动力学(Langevin dynamics) 是一种模拟经典粒子运动的方法,常用于物理、化学和材料科学等领域。它是由法国物理学家保罗朗之万(Paul Langevin)于1908年提出的,用于描述布朗运动,即微小粒…...

双指针技巧,链表

双指针链表 虚拟头节点双指针,都要用虚拟1头节点 合并两个有序链表 设置双指针,都指向虚拟头节点 ListNode list1 代表的是头节点 class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dummynew ListNode(-1…...

鸿蒙 DevEcoStudio:发布进度条通知

使用notificationManager及wantAgent实现功能import notificationManager from ohos.notificationManager import wantAgent from ohos.app.ability.wantAgent Entry Component struct Index {State message: string 发布进度条通知progressValue: number0async publicDownloa…...

web前端之vue动态访问静态资源、静态资源的动态访问、打包、public、import、URL、Vite

MENU 静态资源与打包规则动态访问静态资源直接导入将静态资存放在public目录中动态导入URL构造函数结束语实践与坑附文 静态资源与打包规则 介绍 Vite脚手架在打包代码的时候,会把源代码里对于静态资源的访问路径转换为打包后静态资源文件的路径。主要的区别是文件指…...

Raven2掠夺者2渡鸦2角色创建、游戏预下载、账号怎么注册教程

《渡鸦2》(Raven 2)是由韩国开发的一款大型多人在线角色扮演游戏(MMORPG)类型的手游,作为前作《Raven》的续集,继承并发展了其黑暗奇幻世界观,同时在游戏设计和内容上进行了大量创新。游戏预计于…...

Window VScode配置Conda教程(成功版)

VScode配置Conda 参考博文:https://blog.csdn.net/qq_51831335/article/details/126757014Anaconda安装(注意勾选自动配置环境变量!) 官网:https://www.anaconda.com/download/success VScode配置 python插件安装安装 …...

探索旅行的优惠之选,千益畅行旅游卡让旅程更省心省力!

在旅行的道路上,一张旅游卡往往能为您带来意想不到的便利与优惠。那么,对于千益畅行旅游卡,您是否好奇如何轻松拥有它呢? 首先,千益畅行旅游卡作为旅行者的贴心伴侣,为您提供了多样化的获取渠道。您可以通…...

JVM学习-彻底搞懂Java自增++

从字节码角度分析i和i的区别 public void method6() {int i 10;i; //在局部变量表上直接加1}public void method7() {int i 10;i; //字节码同i}public void method8() {int i 10;int a i; //通过下图可以看出先将局部变量表中的值push到操作数栈,然…...

【全开源】民宿酒店预订管理系统(ThinkPHP+uniapp+uView)

民宿酒店预订管理系统 特色功能: 客户管理:该功能可以帮助民宿管理者更加有效地管理客户信息,包括客户的姓名、电话、地址、身份证号码等,并可以在客户的订单中了解客户的消费情况,从而更好地满足客户的需求&#xff…...

9.3 Go语言入门(变量声明和函数调用)

Go语言入门(变量声明和函数调用) 目录二、变量声明和函数调用1. 变量声明1.1 使用 var 关键字声明1.2 简短声明1.3 零值1.4 常量 2. 函数调用2.1 函数定义2.2 多个返回值2.3 命名返回值2.4 可变参数2.5 匿名函数和闭包 目录 Go 语言(Golang&a…...

CVE-2020-7982 OpenWrt 远程命令执行漏洞学习(更新中)

OpenWrt是一款应用于嵌入式设备如路由器等的Linux操作系统。类似于kali等linux系统中的apt-get等,该系统中下载应用使用的是opgk工具,其通过非加密的HTTP连接来下载应用。但是其下载的应用使用了SHA256sum哈希值来进行检验,所以将下载到的数据…...

代码随想录——左叶子之和(Leetcode404)

题目链接 BFS 队列 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…...

解禁谷歌等浏览器禁止网站使用麦克等媒体设备

1、浏览器地址栏输入chrome://flags/ 微软的chromium内核的edge浏览器,既可以输入:chrome://flags/ ,也可以输入edge://flags/ 2、打开后,界面如下 3、输入搜索,unsafe,并启用、输入需要启用的网址...

如何彻底卸载sql sever2022

目录 背景过程1、关闭sql sever服务2、打开控制面板,卸载SQL Sever3、手动删除 SQL Server 遗留文件4、清空注册表5、重启计算机以确保所有更改生效。 总结 背景 重装了电脑,安装sqlServer,一直报错,不成功,所以每次安…...

「51媒体」如何与媒体建立良好关系?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 与媒体建立良好关系对于企业或个人来说都是一项重要的公关活动。 了解媒体:研究媒体和记者的兴趣,提供相关且有价值的信息。 建立联系:通过专业的方式…...

Selenium 库的爬虫实现

Selenium 是什么? Selenium 是一个用于自动化 Web 应用程序测试的工具。它提供了一个用于测试网站的框架,可以模拟用户在浏览器中的操作,如点击链接、填写表单、提交数据等。Selenium 可以在多种浏览器和操作系统上运行,并且支持…...

【文末附gpt升级方案】数据虚拟化技术的优势

数据虚拟化技术的优势主要体现在以下几个方面: 提高资源利用率和降低成本: 数据虚拟化可以显著减少物理硬件的需求,从而降低硬件成本。通过虚拟化,企业可以利用数据中心提供的规模经济优势,使用更少的服务器来完成相同…...

C++ 常量和变量

1 常量 具体把数据写出来 2,3&#xff0c;4&#xff1b;1.2 1.3;“Hello world!”,“C” cout<<2015 常量&#xff1a;不能改变的量。 字面常量&#xff08;字面量、直接常量&#xff09;:直接写出的数据。 符号常量&#xff1a;用符号表示数据&#xff0c;但它一旦确定…...

【cocos creator 】生成六边形地图

想要生成一个六边形组成的地图 完整代码示例 以下是完整的代码示例&#xff0c;包含了注释来解释每一步&#xff1a; cc.Class({extends: cc.Component,properties: {hexPrefab: {default: null,type: cc.Prefab},mapWidth: 10, // 网格的宽度&#xff08;六边形的数量&am…...

TypeScript类型体操练习

历史小剧场 这个世界上&#xff0c;有两种人最痛苦&#xff0c;第一种是身居高位者&#xff0c;第二种是身居底层者&#xff0c;第一种人很少&#xff0c;第二种人很多。第一种人叫崇祯&#xff0c;第二种人叫百姓。 而最幸福的&#xff0c;就是中间那拨人&#xff0c;主要工作…...

leetcode231-Power of Two

题目 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&#xff1a;n 1 输出&#xff1…...

贪心算法简单介绍

贪心算法是一种在每一步选择中都采取当前状态下最优或最优近似的选择&#xff0c;以期望最终得到全局最优解的算法。贪心算法并不总能得到全局最优解&#xff0c;但在某些问题上&#xff0c;它可以得到全局最优解&#xff0c;并且比动态规划等其他方法更为简单和高效。 贪心算…...

眼底项目经验

眼底项目经验 可解释性不足问题眼底项目有多牛逼可解释性不足解法数据、算力、算法都免费送不仅预测当下&#xff0c;还能预测未来和慢病管理整合&#xff0c;形成一个实时健康检测生态 可解释性不足问题 今天下午和腾讯眼底项目人员讨论, 他们不准备做全身性的多疾种, 因为深…...

使用arco design实现动态列信息的表格

目录 1.说明 2.普通表格的实现 3.动态表格的实现 1.说明 在前端画面中&#xff0c;表格一般用来展示列表数据&#xff0c;并且可以实现分页&#xff0c;应用很广泛&#xff0c;关于表格的列信息&#xff0c;一般是固定的&#xff0c;也可以是变化的&#xff0c;根据后端传递…...

解决 fatal: Not a git repository (or any of the parent directories): .git 问题

解决方法&#xff1a;在命令行 输入 git init 然后回车就好了...

Spring 模拟管理Web应用程序

MVC&#xff1a;Model View Controller 1&#xff09;controller&#xff1a;控制层&#xff08;Servlet是运行服务器端&#xff0c;处理请求响应java语言编写技术&#xff09; 2&#xff09;service&#xff1a;业务层&#xff08;事务&#xff0c;异常&#xff09; 3&#xf…...

修改了vue3 <script setup>留言板

Лунная ночь <template><button class"edit_view_checkbox"><input type"checkbox" v-model"editshowInput" value"编辑" /></button><div class"editshowInput" v-if"editshowI…...