uni-app怎么用过滤器过滤掉数组中的重复项

风芳同学_9885

风芳同学_9885

2026-08-16

330人浏览

原创

uni-app中不能用过滤器(|)去重数组,应使用computed中filter+findindex或map实现;因过滤器仅支持单值格式化,无this上下文且不响应数组变化。

uni-app怎么用过滤器过滤掉数组中的重复项

filter 本身不是过滤器(filter 是数组方法),uni-app 的「过滤器」(| 管道符)只适合格式化单个值,比如日期、价格、字符串截断,**不能用来去重数组**。硬套会报错或无效。 下面直接说清楚该怎么做、为什么、以及最容易栽坑的地方。

uni-app里别用 Vue 过滤器做数组去重

Vue 的 filters 只接收一个输入值,返回一个转换后值,例如:{{ item.price | toFixed }}。你没法把整个数组传进去再吐出一个去重后的新数组——filters 没有 this 上下文、不响应数组变化、也不能调用 findIndex 或 Set 等操作。

常见错误写法(无效):

{{ list | uniqueBy('id') }}

这会直接报 TypeError: Cannot read property 'id' of undefined 或静默失败。

真正能用的数组去重方式(推荐 2 种)

在 computed 或 methods 中处理,确保响应式更新和性能可控。

  • 按某个字段去重(如 id),用 filter + findIndex 最稳妥:
computed: {
  uniqueList() {
    return this.rawList.filter((item, index, arr) => 
      arr.findIndex(v => v.id === item.id) === index
    );
  }
}

✅ 优点:语义清晰、兼容性好(支持所有 uni-app 平台)、不依赖外部库

❌ 注意:如果 rawList 很大(>1000 条),findIndex 每次都遍历,会有轻微性能开销

  • 用 Map 实现 O(n) 去重(更高效,推荐):
computed: {
  uniqueList() {
    const seen = new Map();
    return this.rawList.filter(item => {
      if (seen.has(item.id)) return false;
      seen.set(item.id, true);
      return true;
    });
  }
}

✅ 优势:只遍历一次,比 findIndex 快;Map 在所有 uni-app 目标平台(微信小程序、App、H5)都支持

❌ 注意:别用 Object 当哈希表(比如 seen[item.id] = true),数字 key 可能被 toString 强转,导致 {'1': true, 1: false} 这类意外覆盖

uni-app
uni-app

uni-app 是基于 Vue 的跨端开发框架,适合开发 H5、App、小程序、鸿蒙和多端业务应用。

下载

为什么不用 Set + JSON.stringify?

网上常看到这种写法:

[...new Set(this.rawList.map(i => JSON.stringify(i)))].map(JSON.parse)

它在 uni-app 里容易出问题:

  • 对象属性顺序不一致时,JSON.stringify 结果不同 → 去重失效(比如 {a:1,b:2} 和 {b:2,a:1} 被当成两个不同项)
  • 含 Date、undefined、函数、RegExp 时直接序列化失败或丢失数据
  • 小程序端 JSON.parse 对某些嵌套结构容错性差,偶发白屏

除非你 100% 确认数组里全是简单扁平对象且字段顺序固定,否则绕开它。

如果用了 lodash,_.uniqBy 可以但要注意

安装后确实简洁:

import { uniqBy } from 'lodash'

但在 uni-app 小程序端,lodash 的体积较大(gzip 后约 20KB),可能拖慢首屏。如果只是去重,没必要引入整包。

更轻量的做法是单独引入方法(需配置 babel 插件或使用 esm 版本):

import uniqBy from 'lodash/uniqBy'

但多数项目里,手写 Map 方案更省事、更可控。

去重逻辑本身不复杂,关键在于别混淆「Vue 过滤器」和「数组方法」的职责边界——前者只做展示层转换,后者才管数据结构操作。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

uni-app过滤器 uni-app

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2223

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4783

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5910

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5378

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

763

5

vue2.0和3.0区别
vue2.0和3.0区别

vue2.0和3.0区别:vue2的响应式原理是利⽤“Object.defineProperty()”对数据进⾏劫持结合发布订阅模式的⽅式来实现,vue3中使⽤了es6的proxy API对数据代理,实现对数据的监控。本专题为大家提供vue2.0和3.0区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.17

1634

5

vue3的生命周期有哪些
vue3的生命周期有哪些

vue3的生命周期:1、beforecreate;2、created;3、beforemount;4、mounted;5、beforeupdate;6、updated;7、beforedestroy;8、destroyed;9、activated;10、deactivated等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

11822

5

Vue3组合式API与组件开发实战
Vue3组合式API与组件开发实战

本专题讲解 Vue 3 组合式 API 的核心概念与应用技巧,深入分析响应式系统、生命周期管理、组件设计与复用策略。通过完整项目案例,指导前端开发者实现高性能、结构清晰的 Vue 应用,提升开发效率与代码可维护性。

2026.02.10

296

23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习