做前端这么久,数组处理几乎占了日常逻辑的一半。
以前为了找最后一条数据、安全修改数组、批量判断元素,不得不写 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%,可读性、维护性直接拉满,面试说出来也是加分项。
各位互联网搭子,要是这篇文章成功引起了你的注意,别犹豫,关注、点赞、评论、分享走一波,让我们把这份默契延续下去,一起在知识的海洋里乘风破浪!