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

基于多属性过滤对象数组:实现非完全相同对象的去重处理

对象数组按规则去重解决方案

嘿,我懂你现在的困扰——从那个管理混乱的网站导出的记录里,一堆重复条目,有的是完全一模一样的,有的只是name或weight不一样,你要把这些冗余清掉,只留每个“同主体”记录里weight最大的那条,完全重复的就留一条对吧?我给你整理个清晰的实现思路和代码示例。

核心思路

我们需要先把每条记录按“同主体”分组,然后在每组里筛选出符合要求的记录:

  1. 用一个映射(比如Map)来存储每个主体的最优记录;
  2. 遍历所有记录,给每条生成一个唯一标识键,用来判断是否属于同一个主体(比如除了name和weight之外的所有属性组合,或者如果有现成的唯一ID字段直接用ID);
  3. 遇到新主体直接存入映射;遇到已存在的主体,要么跳过完全重复的,要么替换成weight更大的记录。

代码实现(以JavaScript为例)

第一步:生成唯一标识键

这个函数用来区分不同的主体,如果你有现成的唯一ID字段(比如id、sku),可以直接返回该字段的值,效率更高;如果没有,就用除name和weight外的属性拼接成键:

function getUniqueKey(record) {
  // 过滤掉name和weight属性,排序后拼接成键,避免属性顺序影响判断
  const targetKeys = Object.keys(record)
    .filter(key => key !== 'name' && key !== 'weight')
    .sort();
  return targetKeys.map(key => `${key}:${record[key]}`).join('|');
}

第二步:去重主函数

遍历数组,按规则筛选记录:

function deduplicateRecords(records) {
  const recordMap = new Map();

  for (const currentRecord of records) {
    const key = getUniqueKey(currentRecord);
    const existingRecord = recordMap.get(key);

    if (!existingRecord) {
      // 该主体第一次出现,直接存入映射
      recordMap.set(key, {...currentRecord});
    } else {
      // 检查是否是完全重复的记录
      const isExactDuplicate = JSON.stringify(currentRecord) === JSON.stringify(existingRecord);
      if (isExactDuplicate) {
        // 完全重复,跳过不处理
        continue;
      }
      // 比较weight,保留更大的那条
      if (currentRecord.weight > existingRecord.weight) {
        recordMap.set(key, {...currentRecord});
      }
    }
  }

  // 将映射中的值转为数组返回
  return Array.from(recordMap.values());
}

测试示例

假设你的原始数据是这样的:

const messyRecords = [
  { id: 1, name: "苹果", weight: 10, category: "水果" },
  { id: 1, name: "红苹果", weight: 15, category: "水果" },
  { id: 2, name: "香蕉", weight: 8, category: "水果" },
  { id: 2, name: "香蕉", weight: 8, category: "水果" },
  { id: 3, name: "樱桃", weight: 5, category: "水果" },
  { id: 3, name: "甜樱桃", weight: 7, category: "水果" },
];

const cleanedRecords = deduplicateRecords(messyRecords);
console.log(cleanedRecords);

输出结果会是:

[
  { id: 1, name: "红苹果", weight: 15, category: "水果" },
  { id: 2, name: "香蕉", weight: 8, category: "水果" },
  { id: 3, name: "甜樱桃", weight: 7, category: "水果" }
]

额外注意事项

  • 如果weight是带单位的字符串(比如"15kg"),记得先转换成数字再比较,比如用parseFloat(currentRecord.weight);
  • 用JSON.stringify判断完全重复虽然简单,但如果记录里有函数、undefined等特殊值会失效,这种情况可以改成逐个属性对比;
  • 如果你的记录是其他语言的(比如Python),思路是一样的:用字典存储分组,遍历筛选即可。

内容的提问来源于stack exchange,提问作者Kyle Berry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:04:46