如何向JavaScript Map中添加内容唯一的对象数据?
解决Map中重复内容对象的添加问题
要实现仅当对象内容完全唯一时才添加到myMap的需求,核心是先记录已存在的对象内容特征,每次添加前做重复校验。具体实现如下:
实现思路
- 用
Set集合存储已添加对象的内容标识(校验操作时间复杂度为O(1),效率更高) - 将对象的核心内容(对应
valueA到valueD的属性值)序列化为字符串,作为内容的唯一标识 - 遍历
items时,先校验当前item的内容标识是否已存在:- 不存在:将标识存入
Set,同时把该item对应的对象添加到myMap - 已存在:直接跳过添加操作
- 不存在:将标识存入
修改后的代码
方案一:基于对象序列化(属性顺序固定时适用)
const existingContents = new Set(); const myMap = {}; // 若myMap已提前初始化,可移除该行 for (const item of items) { // 序列化对象内容作为唯一标识 const contentKey = JSON.stringify({ valueA: item.A, valueB: item.B, valueC: item.C, valueD: item.D }); if (!existingContents.has(contentKey)) { existingContents.add(contentKey); myMap[`${item.id}`] = { valueA: item.A, valueB: item.B, valueC: item.C, valueD: item.D }; } }
方案二:基于值数组序列化(属性顺序可能变动时更稳妥)
如果担心对象属性顺序变化导致序列化字符串不一致,可以用属性值的数组生成标识:
const existingContents = new Set(); const myMap = {}; for (const item of items) { // 用值的数组序列化,避免属性顺序影响 const contentKey = JSON.stringify([item.A, item.B, item.C, item.D]); if (!existingContents.has(contentKey)) { existingContents.add(contentKey); myMap[`${item.id}`] = { valueA: item.A, valueB: item.B, valueC: item.C, valueD: item.D }; } }
效果验证
针对你提供的示例输入:
- id为
1234的对象会被正常添加,其内容标识存入existingContents - id为
5678的对象内容唯一,也会被添加 - id为
9876的对象内容与1234重复,会被跳过,不会加入myMap
内容的提问来源于stack exchange,提问作者Ctrl_Alt_Defeat
相关产品推荐
相关产品推荐

