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

TypeScript中如何过滤对象并返回值相同元素组成的新对象?

TypeScript 对象过滤:保留所有值重复的键值对

核心思路

要实现需求只需两步:

  • 先统计对象中每个值的出现频率
  • 遍历原对象,只保留那些出现次数大于1的键值对

基础实现(适用于基本类型值)

下面是通用的TypeScript函数,支持处理值为数字、字符串、布尔等基本类型的对象:

function filterDuplicateValues<T extends Record<string, unknown>>(obj: T): Partial<T> {
  // 统计每个值的出现次数
  const valueFrequency = new Map<unknown, number>();
  for (const val of Object.values(obj)) {
    valueFrequency.set(val, (valueFrequency.get(val) || 0) + 1);
  }

  // 过滤出值重复的键值对
  const filtered: Partial<T> = {};
  for (const [key, val] of Object.entries(obj)) {
    if (valueFrequency.get(val) > 1) {
      filtered[key as keyof T] = val;
    }
  }

  return filtered;
}

示例测试

// 题目示例
const allvalues = { "id1": 3, "id2": 4, "id3": 3 };
const filteredvalues = filterDuplicateValues(allvalues);
console.log(filteredvalues); // 输出: { id1: 3, id3: 3 }

// 无重复值的情况
const noDuplicateObj = { "a": 1, "b": 2, "c": 3 };
console.log(filterDuplicateValues(noDuplicateObj)); // 输出: {}

扩展:处理引用类型值

如果对象的值是对象、数组这类引用类型,默认Map会按引用地址比较,无法识别内容相同的重复值。可以通过JSON.stringify()将值转为字符串来统计:

function filterDuplicateRefValues<T extends Record<string, unknown>>(obj: T): Partial<T> {
  const valueFrequency = new Map<string, number>();
  for (const val of Object.values(obj)) {
    const strKey = JSON.stringify(val);
    valueFrequency.set(strKey, (valueFrequency.get(strKey) || 0) + 1);
  }

  const filtered: Partial<T> = {};
  for (const [key, val] of Object.entries(obj)) {
    const strKey = JSON.stringify(val);
    if (valueFrequency.get(strKey) > 1) {
      filtered[key as keyof T] = val;
    }
  }

  return filtered;
}

// 测试引用类型
const refExample = { x: { a: 1 }, y: { b: 2 }, z: { a: 1 } };
console.log(filterDuplicateRefValues(refExample)); // 输出: { x: { a: 1 }, z: { a: 1 } }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:00:19