编写获取数组中指定双属性值重复对象的函数遇问题
问题分析与解决
需求说明
需要实现一个函数findObjectsWithSameProperties,从对象数组中找出在指定两个属性上值完全相同的重复对象。比如给定数组:
const myObjects = [ { name: "Alice", age: 30 }, { name: "Bob", age: 25 }, { name: "Alice", age: 30 }, { name: "David", age: 25 } ];
预期返回结果为:
[ { name: "Alice", age: 30 }, { name: "Alice", age: 30 }, ];
现有代码的错误
你编写的函数逻辑完全偏离需求:
function findObjectsWithSameProperties(objects, property1, property2) { const matchingObjects = []; for (const obj of objects) { if (obj.hasOwnProperty(property1) && obj.hasOwnProperty(property2)) { // 错误:判断单个对象的两个属性值是否相等 if (obj[property1] === obj[property2]) { matchingObjects.push(obj); } } } return matchingObjects; }
这段代码是在检查单个对象自身的两个属性值是否相等(比如判断某个对象的age和name是否一样),但你的需求是找不同对象之间,这两个属性值都完全相同的重复项。示例中没有任何对象的age和name值相等,所以调用后返回空数组。
修正后的实现
正确思路是先统计每个属性组合的出现次数,再筛选出重复的对象:
function findObjectsWithSameProperties(objects, property1, property2) { // 统计每个属性组合的出现次数 const countMap = new Map(); // 第一次遍历:给每个属性组合计数 for (const obj of objects) { if (obj.hasOwnProperty(property1) && obj.hasOwnProperty(property2)) { // 用两个属性值生成唯一标识键 const key = JSON.stringify([obj[property1], obj[property2]]); countMap.set(key, (countMap.get(key) || 0) + 1); } } // 第二次遍历:筛选出出现次数≥2的对象 return objects.filter(obj => { if (!obj.hasOwnProperty(property1) || !obj.hasOwnProperty(property2)) return false; const key = JSON.stringify([obj[property1], obj[property2]]); return countMap.get(key) >= 2; }); }
调用该函数后,即可得到预期的重复对象数组。
内容的提问来源于stack exchange,提问作者Ralph David Abernathy
相关产品推荐
相关产品推荐

