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

如何根据对象属性值移除JavaScript对象数组中的重复对象

JavaScript 按对象属性值给对象数组去重

针对示例中按邮箱属性去重的需求,推荐使用时间复杂度为O(n)的Set/Map记录方案,性能远优于双重循环比对的实现。

实现代码(保留第一次出现的重复项)

示例数据中每个对象以人名为键、邮箱为值,直接取对象的第一个属性值作为去重判断依据即可:

var data = [
  { "John Doe": "john33@gmail.com" },
  { "William Smith": "william65@gmail.com" },
  { "Robert Johnson": "robert99@gmail.com" },
  { "John Smith": "john33@gmail.com" },
  { "James Johnson": "james8@gmail.com" },
];

var seen = new Set();
var uniqueData = data.filter(function(item) {
  // 取出当前对象的邮箱值
  var currentValue = Object.values(item)[0];
  // 未出现过则保留,否则过滤
  if (!seen.has(currentValue)) {
    seen.add(currentValue);
    return true;
  }
  return false;
});

运行后uniqueData会移除John Smith对应的重复邮箱条目,最终返回4条无重复邮箱的记录。

变体:保留最后一次出现的重复项

如果需要保留重复值中最后一次出现的对象,可以用Map直接覆盖同值的存储记录:

var valueMap = new Map();
data.forEach(function(item) {
  var currentValue = Object.values(item)[0];
  // 同值直接覆盖,最终存的就是最后一次出现的对象
  valueMap.set(currentValue, item);
});
var uniqueDataKeepLast = Array.from(valueMap.values());

适配固定属性名的场景

如果你的对象结构是固定属性名(比如统一用email字段存邮箱,格式为{ name: "John Doe", email: "john33@gmail.com" }),只需要把取值逻辑从Object.values(item)[0]替换为item.email即可,逻辑更稳定。


内容的提问来源于stack exchange,提问作者Syed Kazim Ali Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:54:25