JS 中前后端数据交互前怎么规范进行数组去重

夜瑶同学_2281

夜瑶同学_2281

2026-11-06

926人浏览

原创

数组去重关键在“谁去重”和“按什么规则”,前端仅处理可控的临时重复,如多点按钮、多源聚合、多选清理;基础类型用Set(兼容IE11用Array.from),对象数组按唯一字段用Map去重,禁用JSON.stringify;需结合防抖、空数组校验与提示形成防护链。

js 中前后端数据交互前怎么规范进行数组去重

数组去重本身不依赖前后端交互时机,关键在于“谁去重”和“按什么规则去重”。前端在数据交互前做去重,不是为了替代后端逻辑,而是为避免无效请求、提升用户体验、防止重复提交或渲染异常。规范做法要分清场景、数据类型和责任边界。

明确去重责任:前端只处理“可控且必要”的重复

前端不应承担业务级去重(如用户重复注册、订单重复创建),这类必须由后端校验并拒绝。前端去重仅适用于:

  • 用户本地操作产生的临时重复,比如多次点击“添加标签”按钮导致数组推入相同字符串
  • 前端聚合多个来源数据(如搜索建议 + 历史记录)时的简单合并去重
  • 表单多选控件中用户反复勾选同一项,需实时清理输入值
  • 为减少无意义请求,对即将发给后端的 ID 列表、筛选条件等做预处理

基础类型数组:优先用 Set,兼顾 NaN 和兼容性

对于 number / string / boolean / null / undefined / NaN 等基本类型,Array.from(new Set(arr)) 是最规范简洁的方式。Set 使用 SameValueZero 算法,能正确识别 NaN === NaN,这是 indexOf 或 includes 做不到的。

注意两点:

  • 若需兼容 IE11 等旧环境,改用 Array.from(new Set(arr))(比扩展运算符 [...new Set(arr)] 兼容性更好)
  • Set 不会把 1 和 '1' 当作重复——这是合理行为。若业务要求强制类型宽松去重(如接口字段全为字符串),应先统一转类型再 Set

对象数组:按字段去重,禁用 JSON.stringify 简单对比

遇到 [{id: 1, name: 'a'}, {id: 1, name: 'b'}] 这类数据,不能直接用 Set 或 filter + indexOf —— 它们比较的是引用,不是内容。

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载

规范做法是基于唯一业务字段(如 id、skuCode)去重:

  • 用 Map 记录已出现的 key 值:arr.filter(item => !map.has(item.id) && map.set(item.id, true))
  • 确保字段存在且非空,可加保护:item.id != null
  • 避免使用 JSON.stringify(item) 做键名:属性顺序不保证、undefined 被忽略、函数丢失、循环引用报错,线上极易翻车

交互前校验:结合防抖+去重+提示,形成完整防护链

单纯去重不够。例如用户快速点击“提交”按钮多次,即使数组去重了,仍可能并发发出多个请求。规范流程应包含:

  • 前端收集数据后,先按业务规则去重(如过滤掉重复的 tagId)
  • 对请求动作加防抖或节流(尤其搜索、筛选类接口)
  • 提交前检查数组长度是否为 0,避免空数组请求(后端可能不校验)
  • 去重后如有丢弃项,可轻量提示:“已自动合并重复项”(非必须,视 UX 要求)

不复杂但容易忽略

相关专题

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

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

2023.08.11

2863

5

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

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

2024.03.19

7150

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6686

10

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

5626

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1369

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

5544

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

1020

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1996

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3865

4

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习