VueUse useArrayUnique 实战指南:Vue 3 响应式数组去重的完整实现与用法
前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载导读useArrayUnique是 VueUse 中用于处理响应式数组去重的核心组合式函数它基于 Vue 3 的computed与toValue构建能够对由 ref、响应式数组或 getter 函数组成的列表进行实时去重并在数据变化时自动更新结果。本文将以 useArrayUnique 官方文档 为主体结合其源码实现与单元测试完整讲解三种典型用法多 ref 数组、响应式数组、自定义比较函数及其底层原理帮助你在 Vue 3 项目中快速落地数据去重场景。什么是 useArrayUniqueuseArrayUnique属于 VueUseshared包中 Array数组分类下的工具函数。它接收一个可能包含 ref / getter 的数组或整个是 ref / getter 的数组返回一个ComputedRefT[]——即一个计算属性 ref。只要输入数组或其内部元素发生变化去重结果就会自动重新计算并更新。从导出入口可以看到它与其他数组工具如useArrayDifference、useArrayMap等一同从vueuse/core对外导出因此你可以直接通过vueuse/core包引入使用import { useArrayUnique } from vueuse/core其完整类型签名如下摘自源码export type UseArrayUniqueReturnT any ComputedRefT[] export function useArrayUniqueT( list: MaybeRefOrGetterMaybeRefOrGetterT[], compareFn?: (a: T, b: T, array: T[]) boolean, ): UseArrayUniqueReturnT参数说明参数类型说明listMaybeRefOrGetterMaybeRefOrGetterT[]要执行去重的数组。既可以是普通数组、ref 包裹的数组也可以是返回数组的 getter 函数数组元素本身也可以是 ref / getter调用时会被自动解包compareFn(a: T, b: T, array: T[]) boolean| 可选自定义比较函数用于判断两个元素是否“相等”。不传时使用基于Set的严格相等去重返回值ComputedRefT[]去重后的计算属性数组用法一多个 ref 组成的数组当你的数据源是一组相互独立的 ref 时useArrayUnique会对每个元素调用toValue解包后再去重并且对每一个 ref 的变化都保持响应import { useArrayUnique } from vueuse/core import { ref } from vue const item1 ref(0) const item2 ref(1) const item3 ref(1) const item4 ref(2) const item5 ref(3) const list [item1, item2, item3, item4, item5] const result useArrayUnique(list) // result.value: [0, 1, 2, 3] item5.value 1 // result.value: [0, 1, 2]在上面的示例中初始数组[0, 1, 1, 2, 3]中有两个1去重后得到[0, 1, 2, 3]当item5从3改为1后数组中1出现三次去重结果更新为[0, 1, 2]。整个过程无需手动触发更新result.value始终与源数据保持同步。用法二整个响应式数组list参数也可以是reactive数组或ref包裹的数组去重结果同样自动响应push、splice等数组变更import { useArrayUnique } from vueuse/core import { reactive } from vue const list reactive([1, 2, 2, 3]) const result useArrayUnique(list) // result.value: [1, 2, 3] list.push(1) // result.value: [1, 2, 3]这里reactive([1, 2, 2, 3])去重后得到[1, 2, 3]随后push(1)添加了一个已存在的元素结果仍保持[1, 2, 3]说明去重是持续有效的而不是一次性的静态计算。对应地单元测试 中的should work with ref array用例也验证了ref([1, 2, 2, 3])场景初始长度为 3push(1)后长度仍为 3。用法三自定义比较函数去重对象对于对象数组默认的严格相等比较无法识别“id 相同但内容不同”的元素此时可以传入自定义的compareFnimport { useArrayUnique } from vueuse/core import { reactive } from vue const list reactive([ { id: 1, name: foo }, { id: 2, name: bar }, { id: 1, name: baz }, ]) const result useArrayUnique(list, (a, b) a.id b.id) // result.value: [{ id: 1, name: foo }, { id: 2, name: bar }] list.push({ id: 1, name: qux }) // result.value: [{ id: 1, name: foo }, { id: 2, name: bar }]按id相等去重后id为 1 的三条记录只保留第一个出现的{ id: 1, name: foo }即使再push一条id: 1的新记录结果也不会变化。这正是从源码中的uniqueElementsBy实现可以推断出的行为去重遵循“保留首次出现元素”的策略。源码剖析去重是怎么实现的useArrayUnique的核心实现位于 packages/shared/useArrayUnique/index.ts整体逻辑非常精简function uniqT(array: T[]) { return Array.from(new Set(array)) } function uniqueElementsByT( array: T[], fn: (a: T, b: T, array: T[]) boolean, ) { return array.reduceT[]((acc, v) { if (!acc.some(x fn(v, x, array))) acc.push(v) return acc }, []) } export function useArrayUniqueT( list: MaybeRefOrGetterMaybeRefOrGetterT[], compareFn?: (a: T, b: T, array: T[]) boolean, ): UseArrayUniqueReturnT { return computedT[](() { const resolvedList toValue(list).map(element toValue(element)) return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList) }) }这条实现链路可以拆解为三个关键点双重toValue解包toValue(list)负责解包最外层的 ref / getter随后.map(element toValue(element))再对数组中的每一个元素执行toValue。这就是为什么既支持整个数组是 ref也支持数组元素是 ref / getter。基于Set的默认去重uniq借助Array.from(new Set(array))完成去重。Set基于严格相等SameValueZero语义因此1与1会被视为不同元素NaN也能被正确处理。该实现的时间复杂度为 O(n)。基于reducesome的自定义去重uniqueElementsBy遍历数组通过acc.some(x fn(v, x, array))判断当前元素是否与已收集结果中的某个元素“相等”不等则push进结果。注意compareFn的第三个参数是整个原始数组array这意味着你的比较函数可以访问完整的源数据上下文。此实现为 O(n²)适用于元素较少但需要按字段如id比较的场景。整个函数体被包裹在computed中因此它没有任何副作用源码标注了__NO_SIDE_EFFECTS__每次依赖变化时才会惰性重算且不产生多余的内存开销。该函数的压缩后体积约为 217 B见 packages/export-size.json非常轻量。测试验证与行为边界packages/shared/useArrayUnique/index.test.ts 使用 Vitest 对四种行为进行了验证可作为理解其语义边界的权威参考should work with array of refs用shallowRef构造[0, 1, 1, 2, 3]去重后长度为 4将item5改为2后长度为 3——验证了多 ref 场景的响应式去重。should work with ref arraydeepRef([1, 2, 2, 3])去重后长度为 3push(1)后长度仍为 3——验证了 ref 包裹数组场景。should work with array of reactive and custom compare function对reactive对象数组按id去重长度为 2——验证了自定义比较函数场景。should be defined确认 API 正常导出。从测试与源码可以归纳出以下几点使用注意事项默认去重只针对“值”而非“引用结构”对象默认不会被深度去重只有同一个引用或严格相等的原始值才会被合并需要按字段去重时务必提供compareFn。保留首次出现的元素自定义比较场景下重复项中排在最前面的元素会被保留后续出现的会被丢弃。结果不可直接赋值修改返回的是ComputedRef应通过读取.value使用修改源数组才是正确的数据驱动方式。复杂度提示默认Set实现为 O(n)自定义比较为 O(n²)当数组规模很大且需要自定义比较时建议评估性能影响。与相关数组工具的搭配useArrayUnique只是 VueUse Array 分类下的工具之一在实际业务中常与同类响应式数组工具搭配使用例如useArrayDifference求两个数组的差集支持symmetric选项计算对称差useArrayMap/useArrayFilter/useArrayFind响应式地执行映射、过滤与查找useArrayIncludes/useArrayEvery/useArraySome响应式地进行包含与逻辑判断。一个典型的组合场景是先用useArrayMap提取对象列表的某个字段再用useArrayUnique得到去重后的字段枚举值如渲染下拉选项或者先用useArrayDifference找出新增项再与useArrayUnique合并维护一个不重复的已选项集合。这些函数共享MaybeRefOrGetter输入与ComputedRef输出的统一设计可以无缝串联。总结useArrayUnique以极简的代码实现了响应式数组去重的全部能力默认Set去重、双重toValue解包、可选的自定义比较函数以及基于computed的自动更新。无论是处理多 ref 列表、reactive数组还是按对象字段去重它都能以声明式的方式保持结果与源数据同步是 Vue 3 项目中处理去重逻辑时值得优先选择的方案。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐airi 项目中的 useArrayUnique 实战指南VueUse 响应式数组去重 Composable 的用法与原理airi 项目中的 useArrayUnique 实战指南VueUse 响应式数组去重 Composable 的用法与原理 本篇技术指南聚焦 VueUse 的AI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染在 Vue 3 项目中使用 useArrayFilter 实现响应式数组过滤VueUse 响应式 Array.filter 深度实战在 Vue 3 项目中使用 useArrayFilter 实现响应式数组过滤VueUse 响应式 Array.filter 深度实战 useArrayFiltAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染Langfuse LLM 可观测性多语言支持指南4 份文档、1 行 i18n 配置一次讲清Langfuse LLM 可观测性多语言支持指南4 份文档、1 行 i18n 配置一次讲清 周一早上一位日本协作工程师私聊你Langfuse 有没有日文前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AODV路由协议在OPNET中的仿真建模与参数调优全攻略

AODV路由协议在OPNET中的仿真建模与参数调优全攻略

简介:OPNET中实现AODV路由协议的完整建模资源,面向移动自组网研究者、网络仿真开发人员以及需要评估路由性能的师生。内容围绕AODV从路由发现、路由传播到路由建立与维护这一完整机制展开,提供了可导入OPNET的仿真工程、NIST节点场景、无线局…

2026/10/5 8:53:43 阅读更多 →
Javaweb物流管理系统实战:从JSP+Servlet部署到运单状态流转

Javaweb物流管理系统实战:从JSP+Servlet部署到运单状态流转

简介:基于JavaWeb的物流管理系统项目压缩包,适合正在学习JavaWeb开发、准备课程设计或希望了解物流业务信息化流程的读者。包内共717个文件,包含97个Java源码、82个JSP页面、77个Jar依赖库、51个XML配置以及大量前端资源,并配有do…

2026/10/5 8:52:43 阅读更多 →
基于Python与YOLOv8的鱼类疾病检测系统实战指南

基于Python与YOLOv8的鱼类疾病检测系统实战指南

简介:基于Python与YOLOv8开发的鱼类疾病检测系统源码,面向水产养殖从业者、计算机视觉学习者和算法工程师,用于对多种鱼类常见病症(如出血、眼部缺陷、鳍部缺陷、溃疡)进行自动化识别与实时监测。系统支持图片、视频及…

2026/10/5 8:52:43 阅读更多 →

最新新闻

超级电容UPS设计:精准实现10-60秒掉电数据保存

超级电容UPS设计:精准实现10-60秒掉电数据保存

1. 项目概述:为什么一个“只撑60秒”的UPS反而更值得深挖?你有没有遇到过这样的场景:嵌入式设备正在往Flash里写关键日志,突然市电跳闸——结果数据没写完,整个固件分区校验失败,设备直接变砖?或…

2026/10/5 13:44:15 阅读更多 →
BEVFusion核心模块拆解:fuser特征融合与decoder解码器解析

BEVFusion核心模块拆解:fuser特征融合与decoder解码器解析

跑通MIT-BEVFusion的推理demo之后,我原以为最难啃的骨头是那些视觉特征提取和点云体素化的部分。结果真正花掉我最多时间的,是这篇标题里的两个模块: fuser (特征融合)和 decoder (解码特征&#xff09…

2026/10/5 13:44:15 阅读更多 →
SolidWorks电气插件安装失败:SQL Server连接与修复实战指南

SolidWorks电气插件安装失败:SQL Server连接与修复实战指南

装SolidWorks电气插件的朋友应该都有同感:这个组件和软件里的其他模块截然不同,它天生绑定一套数据库服务,不仅要装SQL Server,还得把数据库连接配置得明明白白,稍有偏差就是连环报错。我最近帮同事处理一台SolidWorks…

2026/10/5 13:44:15 阅读更多 →
Sentinel-2 L1C与L2A数据本质区别及USGS下载避坑指南

Sentinel-2 L1C与L2A数据本质区别及USGS下载避坑指南

1. 为什么USGS根本不是Sentinel-2数据的主渠道?先破一个流传最广的迷思 “Sentinel-2 哨兵2数据下载方法(USGS)-史上最全讲解”——这个标题本身就是一个典型的行业认知偏差放大器。我第一次在某高校遥感实验室看到学生拿着USGS Earth Explor…

2026/10/5 13:44:15 阅读更多 →
安全网关Power_V(E系列)运维手册:从上线到策略配置与故障排查

安全网关Power_V(E系列)运维手册:从上线到策略配置与故障排查

简介:《网御星云安全网关 Power V(E 系列)界面操作手册 VERSION 3.0》是一份面向网络安全运维人员、系统管理员及相关技术人员的官方操作指南,适用于网御防火墙系统 V3.0 Power_V6000-F1310 及同系列安全网关设备。手册从产品概述、拆箱检查与安装步骤入…

2026/10/5 13:44:15 阅读更多 →
苏州公司团建选农家菜馆,技术视角下的五维评估模型

苏州公司团建选农家菜馆,技术视角下的五维评估模型

公司团建选农家菜馆,表面看是在挑菜,实际是在挑一个能同时承接吃饭、活动、拍照、不翻车的综合场地。很多行政或HR第一次负责这件事,容易被看起来热闹的页面带偏。真正的判断框架可以压缩成五个维度:交通可达性、场地承载力、出品…

2026/10/5 13:43:15 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →