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

如何在不修改原始数组的情况下反转数组?

reverse()方法颠倒了数组中元素的顺序,但它改变了原始数组。我们举一个简单的例子来论证这个案例,

const originalArray = [1, 2, 3, 4, 5];
const newArray = originalArray.reverse();

console.log(newArray); // [ 5, 4, 3, 2, 1]
console.log(originalArray); // [ 5, 4, 3, 2, 1]

很少有解决方案不会改变原始数组。让我们来看看。

  1. 使用切片和反向方法: 在这种情况下,只需调用slice()数组上的方法来创建一个浅拷贝,然后reverse()调用该拷贝的方法。

    const originalArray = [1, 2, 3, 4, 5];
    const newArray = originalArray.slice().reverse(); //Slice an array gives a new copy
    
    console.log(originalArray); // [1, 2, 3, 4, 5]
    console.log(newArray); // [ 5, 4, 3, 2, 1]
  2. 使用扩展和反向方法: 在这种情况下,让我们使用扩展语法 (...) 创建数组的副本,然后reverse()在副本上调用方法。

    const originalArray = [1, 2, 3, 4, 5];
    const newArray = [...originalArray].reverse();
    
    console.log(originalArray); // [1, 2, 3, 4, 5]
    console.log(newArray); // [ 5, 4, 3, 2, 1]
  3. 使用reduce和spread方法: 这里对数组元素执行reducer函数,并使用spread语法将累积的数组附加到右侧

    const originalArray = [1, 2, 3, 4, 5];
    const newArray = originalArray.reduce((accumulator, value) => {
      return [value, ...accumulator];
    }, []);
    
    console.log(originalArray); // [1, 2, 3, 4, 5]
    console.log(newArray); // [ 5, 4, 3, 2, 1]
  4. 使用reduceRight 和spread 方法: 这里对数组元素执行右reducer 函数(即reduce 方法的相反方向),并使用spread 语法将累积的数组附加到左侧

    const originalArray = [1, 2, 3, 4, 5];
    const newArray = originalArray.reduceRight((accumulator, value) => {
      return [...accumulator, value];
    }, []);
    
    console.log(originalArray); // [1, 2, 3, 4, 5]
    console.log(newArray); // [ 5, 4, 3, 2, 1]
  5. 使用reduceRight 和push 方法: 这里对数组元素执行一个右reducer 函数(即reduce 方法的相反方向)并将迭代的值推送到累加器

    const originalArray = [1, 2, 3, 4, 5];
    const newArray = originalArray.reduceRight((accumulator, value) => {
      accumulator.push(value);
      return accumulator;
    }, []);
    
    console.log(originalArray); // [1, 2, 3, 4, 5]
    console.log(newArray); // [ 5, 4, 3, 2, 1]

相关文章:

  • 以太坊学习二:签名
  • 配置本地Maven仓库——IDEA配置本地Maven源
  • mysql8-索引的使用规则验证
  • Python神经网络入门与实战,神经网络算法python实现
  • un8.31:用jQuery实现调用不同项目api接口的功能。
  • Java Agent入门教程
  • 航班信息查询 易语言代码
  • C++ 小游戏 视频及资料集(四)
  • 利用HFSS-API设计指数渐变传输线
  • js的es6
  • 开源交流丨任务or实例 详解大数据DAG调度系统Taier任务调度
  • 配置Tomcat时系统环境变量已经配置好,但是启动Tomcat时还是闪退的解决办法
  • app,小程序打包
  • CVPR2022|比VinVL快一万倍!人大提出交互协同的双流视觉语言预训练模型COTS,又快又好!
  • 2023年考武汉安全员证有什么作用?安全员岗位职责是什么?甘建二
  • 【mysql】环境安装、服务启动、密码设置
  • Android优雅地处理按钮重复点击
  • download使用浅析
  • flutter的key在widget list的作用以及必要性
  • Joomla 2.x, 3.x useful code cheatsheet
  • 分布式任务队列Celery
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 再次简单明了总结flex布局,一看就懂...
  • Prometheus VS InfluxDB
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​比特币大跌的 2 个原因
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (2020)Java后端开发----(面试题和笔试题)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (二)PySpark3:SparkSQL编程
  • (三)mysql_MYSQL(三)
  • (十八)SpringBoot之发送QQ邮件
  • (四)Linux Shell编程——输入输出重定向
  • (转)Android学习笔记 --- android任务栈和启动模式
  • ***测试-HTTP方法
  • .NET 4.0中的泛型协变和反变
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET BackgroundWorker
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net6Api后台+uniapp导出Excel
  • .net中调用windows performance记录性能信息
  • .project文件
  • /dev/sda2 is mounted; will not make a filesystem here!
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [C++核心编程](四):类和对象——封装
  • [hive] 窗口函数 ROW_NUMBER()
  • [HJ73 计算日期到天数转换]
  • [INSTALL_FAILED_TEST_ONLY],Android开发出现应用未安装