新闻中心

js实现嵌套数组对象去重

2025-11-09
浏览次数:
返回列表
答案:按属性去重可用Map或reduce,多属性组合可拼接键值,深度去重可用JSON.stringify或lodash的isEqual,推荐根据数据结构选择方法。

js实现嵌套数组对象去重

在 J*aScript 中,处理嵌套数组对象去重时,关键在于如何定义“重复”。通常我们认为两个对象的某个或某些属性值相同即为重复。下面以常见场景为例,介绍几种实用的去重方法。

1. 按单一属性去重

如果对象中有一个唯一标识字段(如 id),可以通过该字段进行去重。

使用 Mapreduce 方法按指定属性过滤重复项:

示例数据:
const arr = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 1, name: 'Alice' }
];

方法一:使用 Map

const uniqueById = Array.from(
  new Map(arr.map(item => [item.id, item])).values()
);

方法二:使用 reduce

const uniqueById = arr.reduce((acc, curr) => {
  if (!acc.some(item => item.id === curr.id)) {
    acc.push(curr);
  }
  return acc;
}, []);

2. 按多个属性组合去重

当需要根据多个字段(如 id 和 name)共同判断是否重复时,可以将这些字段拼接成字符串作为唯一键。

示例: 根据 id 和 name 去重

const uniqueByKeys = Array.from(
  new Map(
    arr.map(item => [`${item.id}-${item.name}`, item])
  ).values()
);

这种方法适用于固定字段的精确匹配。

3. 深度去重(处理任意嵌套结构)

若对象结构复杂且需深度比较内容,可借助 JSON.stringify 配合 Set 实现,但注意顺序和类型必须一致。

火龙果写作 火龙果写作

用火龙果,轻松写作,通过校对、改写、扩展等功能实现高质量内容生产。

火龙果写作 277 查看详情 火龙果写作

简单实现:

const deepUnique = Array.from(
  new Set(arr.map(JSON.stringify)),
  JSON.parse
);

注意: 此方法对属性顺序敏感。例如 {a:1,b:2} 和 {b:2,a:1} 被视为不同对象。

如需真正深度比较,建议引入 lodash 的 isEqual,或自行实现递归对比函数。

4. 使用 lodash 简化操作

如果你项目中使用了 lodash,可以直接用 _.uniqBy 方法。

import { uniqBy } from 'lodash';
const result = uniqBy(arr, 'id');
// 多字段支持:uniqBy(arr, o => [o.id, o.name].join('-'))

基本上就这些常用方式。选择哪种取决于你的数据结构和性能要求。对于小数据量,JSON.stringify 方便快捷;对于大数组或复杂逻辑,推荐使用 Map + 键映射的方式,效率更高。

以上就是js实现嵌套数组对象去重的详细内容,更多请关注其它相关文章!


# 如何实现  # 海沧seo教学  # 网站建设500元全包  # 模块化网站SEO优化  # 济宁网站建设优化技术  # seo分析看什么数据  # seo白帽公司  # 任丘提升门厂家网站推广  # 嘉峪关网站优化推广电话  # 密云抖音关键词排名推荐  # 铜川抖音关键词排名  # 如果你  # 扁平化  # javascript  # 如何使用  # 多字  # 自定义  # 多个  # 有哪些  # 数据结构  # 递归  # red  # json  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 曝R星经典之作开发图 设计简陋但信息密集!  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  Python多线程中正确使用sigwait处理SIGALRM信号  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  《噬血代码2》新预告片发布 展示游戏剧情  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  Django通过AJAX异步上传图片并保存至模型的完整指南  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  12306怎么选座位选到安静区_12306选座安静区域选择策略  J*aScript map 方法中处理循环元素为空数组的策略  J*aScript中正确使用querySelectorAll与复杂CSS选择器  黑猫投诉统一入口官网 消费者权益保护投诉平台  解决深度学习模型训练初期异常高损失与完美验证准确率问题  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  Tailwind CSS line-clamp 布局问题解析与修复指南  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  Django表单提交验证失败后保持字段值不刷新  自定义Bag-of-Words实现:处理带负号的词汇权重  深入理解Promise链:如何在catch后中断then的执行  在Typer应用中优雅地处理和重组任意命令行参数  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  机器学习中对数变换预测结果的反向还原  如何使用纯J*aScript判断Input元素是否在特定类容器内  Tabulator表格中精确实现日期时间排序的指南  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  微信网页版官方快速登录入口 微信网页版网页版账号直达  如何将HTML表格多行数据保存到Google Sheets  服务端验证_j*ascript输入检查  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  利用Bokeh CustomJS动态控制DataTable列可见性  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  AO3最新入口2025公告_AO3中文官网合集  J*aScript中如何高效提取对象指定属性  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  探索高级语言到原生C/C++的转译:挑战与内存管理策略  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  在哪找SublimeJ远程工具_SFTP插件配置教程  Python中如何避免重复条件判断:利用数据结构实现动态逻辑 

搜索