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

面试官:【js多维数组扁平化去重并排序】

文章目录

  • 前言
  • 方法一
  • 方法二
  • 方法三
  • 方法四
  • 总结
  • 后言

前言

hello world欢迎来到前端的新世界


😜当前文章系列专栏:JavaScript
🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力

方法一

使用递归方法扁平化——性能较差

function flatten(arr) {return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []);
}let multiArr = [1, 2, [3, 4, [5, 6], 7], [8, 9]];
let flatArr = flatten(multiArr);let uniqueArr = [...new Set(flatArr)];let sortedArr = uniqueArr.sort((a, b) => {return a - b});console.log(sortedArr);

这种方法使用了递归来扁平化整个数组,可以处理任意多层的嵌套数组。但是,对于非常大的多维数组,递归方法的性能会很差。


方法二

使用ES6的扩展运算符扁平化——性能较差

let multiArr = [1, 2, [3, 4, [5, 6], 7], [8, 9]];
let flatArr = [].concat(...multiArr);let uniqueArr = [...new Set(flatArr)];let sortedArr = uniqueArr.sort((a, b) => {return a - b});console.log(sortedArr);

这种方法使用了ES6的扩展运算符将多维数组扁平化为一维数组,然后使用Set进行去重。但是,它仍然需要创建一个新的数组,因此对于非常大的多维数组,它的性能也不是很好。


方法三

使用reduce方法扁平化——性能较好

let multiArr = [1, 2, [3, 4, [5, 6], 7], [8, 9]];
let flatArr = multiArr.reduce((acc, val) => {return acc.concat(Array.isArray(val) ? val.flat() : val);
}, []);let uniqueArr = [...new Set(flatArr)];let sortedArr = uniqueArr.sort((a, b) => {return a - b});console.log(sortedArr);

这种方法使用了reduce方法对多层嵌套的数组进行扁平化。由于使用了原生的Array.prototype.flat方法,因此它的性能相对较快。但是,需要注意的是flat方法可能无法在所有环境下使用。


方法四

使用迭代方法扁平化——性能最佳

let multiArr = [1, 2, [3, 4, [5, 6], 7], [8, 9]];
let queue = [...multiArr];
let flatArr = [];while(queue.length > 0) {let node = queue.shift();if(Array.isArray(node)) {queue.unshift(...node);} else if(node !== undefined) {flatArr.push(node);}
}let uniqueArr = [...new Set(flatArr)];let sortedArr = uniqueArr.sort((a, b) => {return a - b});console.log(sortedArr);

这种方法使用了迭代方法扁平化数组,没有使用任何递归,也不需要重新分配内存。这使得它在处理大型多维数组时具有更好的性能。


总结

最优解决方案是使用迭代方法扁平化,因为它具有最好的性能,并且不会产生与内存分配相关的问题。但是,如果您需要兼容一些老的浏览器或运行时环境,您可以使用reduce方法扁平化。如果您不需要考虑性能问题,那么递归方法和扩展运算符也是可行的选项。

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力

http://www.lryc.cn/news/240653.html

相关文章:

  • C#编程题分享(3)
  • Redis下载和安装(Windows系统)
  • MySQL数据库:开源且强大的关系型数据库管理系统
  • 如何在AD的PCB板做矩形槽孔以及如何倒圆弧角
  • SpringMVC日志追踪笔记整理
  • UML建模图文详解教程06——顺序图
  • 睡前随笔记录
  • 微服务学习|Feign:快速入门、自定义配置、性能优化、最佳实践
  • 使用【画图】软件修改图片像素、比例和大小
  • DevOps 事后分析
  • fastdfs-client-java-1.30 maven 打包安装
  • 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵
  • Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo
  • C/C++ 实现Windows注册表操作
  • nginx 模块相关配置及结构理解
  • 同时创建多个websoket(初始化多个连接、断开的重连、每个连接定时发消息、每个连接存储接收的数据(vuex或者pinia))
  • C语言——指针(一)
  • 学习量化交易如何入门?
  • CSS3动画
  • 黑马点评-10实现用户点赞和点赞排行榜功能
  • Spring配置其他注解Spring注解的解析原理
  • TypeScript 学习笔记 第一部分 语法基础
  • 【element优化经验】怎么让element-ui中表单多语言切换排版不乱
  • 软件设计中如何画各类图之一实体关系图(ER图):数据库设计与分析的核心工具
  • 【神印王座】龙皓晨美妆胜过月夜,魔神皇识破无视,撮合月夜阿宝
  • 汽车级全保护型六路半桥驱动器NCV7708FDWR2G 原理、参数及应用
  • 【小技巧】MyBatis 中 SQL 写法技巧小总结
  • C#编程题分享(4)
  • CTF靶场搭建及Web赛题制作与终端docker环境部署
  • nodejs express vue uniapp新闻发布系统源码