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

编写获取数组中指定双属性值重复对象的函数遇问题

问题分析与解决

需求说明

需要实现一个函数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:52:49