紧急更新!JS数组又来新API!告别循环嵌套,一行代码直接起飞

0 阅读3分钟

做前端这么久,数组处理几乎占了日常逻辑的一半。

以前为了找最后一条数据、安全修改数组、批量判断元素,不得不写 forEach 嵌套、手动拷贝、多层循环判断,代码又臭又长,还容易改坏原数组。

现在 ES 新特性直接补齐短板,4 个超强数组新 API,Vue / React / 小程序 / Node.js 通用,不用装 Lodash,原生就能用,代码简洁度直接翻倍。


1. findLast / findLastIndex

从后往前找,再也不用 reverse + 拷贝

以前想拿数组最后一个满足条件的项,要这么写:

const list = [1, 3, 5, 7, 9]

// 老写法:又绕又容易错
const target = [...list].reverse().find(item => item > 4)
const index = list.length - 1 - [...list].reverse().findIndex(item => item > 4)

现在一行搞定:

// 从后往前找第一个满足条件的值
const target = list.findLast(item => item > 4) // 9

// 从后往前找索引
const index = list.findLastIndex(item => item > 4) // 4

真实业务场景 订单列表、消息列表、日志列表,永远只需要最后一条符合条件的数据,这个 API 直接封神。


2. toReversed / toSorted / toSpliced / with

immutable 安全操作,不污染原数组

以前用 reverse / sort / splice 都会直接改原数组,一不小心就翻车:

const arr = [3,1,2]
const newArr = arr.sort() // 原数组 arr 也被改了!

现在新 API 全部返回新数组,原数组纹丝不动:

const arr = [3,1,2]

// 反转(不改变原数组)
arr.toReversed()

// 排序(不改变原数组)
arr.toSorted()

// 切割删除(不改变原数组)
arr.toSpliced(1, 1)

// 替换指定下标的值(超级好用)
arr.with(1, 999) // 下标1替换成999

再也不用写 [...arr] 浅拷贝了,代码干净十倍。


3. Array.fromAsync

异步遍历神器,告别 Promise 地狱

处理异步数组时,以前你得这样:

const res = await Promise.all(ids.map(id => fetchItem(id)))

遇到需要流式、分批、异步生成的数组,forEach 根本顶不住。

现在直接:

const asyncIterable = createAsyncData() // 异步可迭代对象

// 直接转成数组,自带异步等待
const result = await Array.fromAsync(asyncIterable, item => {
  return item.data
})

Node.js 流、前端分页加载、异步列表处理,直接起飞。


4. group / groupToMap 数组分组

一行分组,告别手写循环

后端返回列表,前端要按类型/状态/时间分组,以前要写一堆:

const group = {}
list.forEach(item => {
  if (!group[item.type]) group[item.type] = []
  group[item.type].push(item)
})

现在:

const group = list.group(item => item.type)

返回结构直接就是:

{
  goods: [....],
  order: [....],
  coupon: [....]
}

想更严谨用 groupToMap,支持复杂 key:

const map = list.groupToMap(item => item.status)

5. 一些高频实用小语法

// 取最后一项(再也不用 arr[arr.length-1])
arr.at(-1)

// 判断是否所有项满足条件
arr.every(...)

// 判断是否至少一项满足
arr.some(...)

// 扁平化数组
arr.flat(Infinity)

避坑提醒(非常重要)

  • 这些新 API 不支持 IE
  • 小程序、现代浏览器、Node.js 18+ 基本都支持
  • 极低版本环境可以用 core-js 做兼容

总结

以前要写十几行的数组逻辑,现在一行就能搞定

  • 从后查找:findLast
  • 安全修改:toReversed / toSorted / toSpliced / with
  • 异步数组:Array.fromAsync
  • 数据分组:group / groupToMap

学会这一套,业务代码至少精简 50%,可读性、维护性直接拉满,面试说出来也是加分项。


各位互联网搭子,要是这篇文章成功引起了你的注意,别犹豫,关注、点赞、评论、分享走一波,让我们把这份默契延续下去,一起在知识的海洋里乘风破浪!