You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向JavaScript Map中添加内容唯一的对象数据?

解决Map中重复内容对象的添加问题

要实现仅当对象内容完全唯一时才添加到myMap的需求,核心是先记录已存在的对象内容特征,每次添加前做重复校验。具体实现如下:

实现思路

  1. 用Set集合存储已添加对象的内容标识(校验操作时间复杂度为O(1),效率更高)
  2. 将对象的核心内容(对应valueA到valueD的属性值)序列化为字符串,作为内容的唯一标识
  3. 遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:42:43