别再用老办法了,这几个数组新API更好用

更新日期: 2026-04-24 阅读: 22 标签: 数组

写JavaScript的时候,你是不是还在用for循环倒着找东西?或者写[...arr].reverse()来反转数组?其实有更简单的办法。

从2022年开始,JavaScript加了好几个数组的新方法。这些方法能让你少写很多代码,还不容易出错。Vue、React、微信小程序、Node.js都能用。


四个最有用的数组新方法

需求老写法新写法
从末尾找第一个匹配的元素手动写for循环倒着找findLast()
从末尾找第一个匹配的索引倒着遍历记住位置findLastIndex()
反转数组但不改原数组[...arr].reverse()toReversed()
拿最后一个元素arr[arr.length - 1]at(-1)

用上新方法,代码能少写一大半,逻辑也清楚多了。


一、findLast:从后面开始找

假设你有一个消息列表,想找最后一条已读的消息。老办法得自己写循环倒着找:

const messages = [
  { id: 1, read: false },
  { id: 2, read: true },
  { id: 3, read: false },
  { id: 4, read: true }
];

// 老写法
let lastRead = null;
for (let i = messages.length - 1; i >= 0; i--) {
  if (messages[i].read) {
    lastRead = messages[i];
    break;
  }
}

// 新写法
const lastRead = messages.findLast(msg => msg.read);
console.log(lastRead); // { id: 4, read: true }

在Vue3里这样用:

<script setup>
import { ref } from 'vue'

const logs = ref([
  { level: 'info' },
  { level: 'error' },
  { level: 'warn' },
  { level: 'error' }
])

// 找最后一个error日志
const lastError = logs.value.findLast(log => log.level === 'error')
</script>


二、findLastIndex:找最后一个匹配的位置

比如你有一个任务列表,想删掉最后一个包含"买"字的任务。用findLastIndex可以快速定位:

const tasks = ['买牛奶', '遛狗', '买面包', '打电话', '买鸡蛋'];

// 找最后一个包含"买"的任务在哪
const lastIndex = tasks.findLastIndex(task => task.includes('买'));

if (lastIndex !== -1) {
  tasks.splice(lastIndex, 1); // 删掉"买鸡蛋"
}

console.log(tasks);
// ['买牛奶', '遛狗', '买面包', '打电话']

这个方法不会把整个数组都找一遍,找到就停,比老办法快。


三、toReversed:反转但不改原数组

reverse()这个方法有个坑:它会直接改掉原来的数组。很多时候你只是想拿反转后的结果用一下,并不想动原始数据。

const original = [1, 2, 3, 4, 5];

// reverse会改原数组
const reversed1 = original.reverse();
console.log(original); // [5, 4, 3, 2, 1] 原数组变了

// toReversed不改原数组
const reversed2 = original.toReversed();
console.log(original); // [1, 2, 3, 4, 5] 没问题
console.log(reversed2); // [5, 4, 3, 2, 1]

在React里用很方便,不用担心改了父组件传进来的数据:

function MessageList({ messages }) {
  // 安全反转,不影响原来的messages
  const reversedMessages = messages.toReversed();

  return (
    <ul>
      {reversedMessages.map(msg => <li key={msg.id}>{msg.text}</li>)}
    </ul>
  );
}


四、at:用负数拿后面的元素

想拿数组最后一个元素,老得写arr[arr.length - 1],又长又容易写错。at方法支持负数索引,-1是最后一个,-2是倒数第二个。

const arr = ['a', 'b', 'c', 'd', 'e'];

const last = arr.at(-1);      // 'e'
const secondLast = arr.at(-2); // 'd'
const first = arr.at(0);       // 'a'

at也能用在字符串上:

'hello'.at(-1)  // 'o'


容易踩的四个坑

坑一:找的方向搞反

想找第一个匹配的用find(),想找最后一个用findLast(),别弄混了。

坑二:以为toReversed会改原数组

toReversed不改原数组。如果你确实想改原数组,那还是用reverse()。

坑三:at超出范围返回undefined

const arr = [1, 2];
console.log(arr.at(10));  // undefined,不报错
console.log(arr.at(-10)); // undefined

用的时候记得判断一下返回值是不是undefined。

坑四:兼容性问题

这几个方法主流环境都支持:

  • Chrome 92以上

  • Firefox 90以上

  • Safari 15.4以上

  • Node.js 16以上

  • 微信小程序基础库2.24.0以上

只有IE不支持。如果你的项目还要兼容老环境,装一个core-js就行:

pnpm add core-js@3

然后在入口文件最上面引入:

import 'core-js/stable';

之后新语法就能正常跑了。


总结

这四个方法都不复杂,但用起来确实顺手。findLast和findLastIndex帮你省掉倒着写循环的麻烦,toReversed让你不用担心改错原数组,at让拿最后一个元素变得简单。

下次写代码的时候,试试这几个新方法,能少写不少代码。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13712

相关推荐

indexOf的三种使用方法

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。这里基本用法大家一般都清楚,一般在实际工作中常与数组的方法合用来对数组进行一些操作

关于Vue不能监听(watch)数组变化

vue无法监听数组变化的情况,但是数组在下面两种情况下无法监听:利用索引直接设置数组项时,例如arr[indexofitem]=newValue;修改数组的长度时,例如arr.length=newLength

JS计算两个数组的交集、差集、并集、补集(多种实现方式)

使用 ES5 语法来实现虽然会麻烦些,但兼容性最好,不用考虑浏览器 JavaScript 版本,使用 ES5 语法来实现虽然会麻烦些,但兼容性最好,不用考虑浏览器 JavaScript 版本。也不用引入其他第三方库。

js数组中改变元素的位置:互换,置顶,上移,下移

unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。splice() 方法可删除从 index 处开始的零个或多个元素

js使用数组+循环+条件实现数字转换为汉字的简单方法。

单个数字转汉字的解决方法:利用数组存储0-9的汉字、 ary.length和str.length不用多说,这是指ary数组和str字符串的长度。这里我们需要注意的是str.charAt(j)和ary[i],分别指在str这个字符串中索引为j的元素,在ary中索引为i的元素。

Js遍历数组时注意 Empty Item 的影响

这两天碰到个问题:从日志中发现一些来自 iOS 10.3 的报错「Cannot read property \\\'xxx\\\' of undefined」,定位到代码的报错位置,发现是遍历某数组时产生的报错,该数组的元素应该全都是 Object,但实际上出现了异常的元素

JS数组扁平化(flat)方法总结

需求:多维数组=>一维数组 ;flat和flatMap方法为ES2019(ES10)方法,目前还未在所有浏览器完全兼容。第四种处理:用 reduce 实现数组的 flat 方法

数组、字符串去重

今天说的数组和字符串去重呢,主要用到es6新的数据结构 Set,它类似于数组,但是成员的值都是唯一的,没有重复的值,所以活用Set来进行数组和字符串的去重。

Js数组中所有方法(超详细)

concat()把元素衔接到数组中。 every() 方法使用指定函数检测数组中的所有元素:filter()返回满足断言函数的数组元素。forEach()为数组的每一个元素调用指定函数。

[译]async-await 数组循环的几个坑

在 Javascript 循环中使用 async/ await 循环遍历数组似乎很简单,但是在将两者结合使用时需要注意一些非直观的行为。让我们看看三个不同的例子,看看你应该注意什么,以及哪个循环最适合特定用例。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!