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
相关产品推荐
相关产品推荐

