You need to enable JavaScript to run this app. JavaScript如何实现对象数组多属性键值对的匹配筛选
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何实现对象数组多属性键值对的匹配筛选

freeCodeCamp中级算法题多属性对象筛选实现

正在完成 freeCodeCamp(FCC)的中级算法脚本挑战:Wherefore Art Thou。

挑战规则说明

编写一个函数,接收对象数组作为第一个参数,返回所有包含第二个参数(源对象)中全部匹配键值对的对象组成的数组。只有源对象的每一个键值对都存在于集合中的对象内时,该对象才可被纳入返回数组。

示例:若第一个参数为[{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二个参数为{ last: "Capulet" },则必须返回数组中的第三个对象,因为它包含第二个参数指定的键值对。

现有问题代码

function whatIsInAName(collection, source) {
  var arr = [];
  let propFinder = Object.keys(source);

  // Only change code below this line
  collection.map(x=>{
    if(x[propFinder] ===  source[propFinder]){
      arr.push(x)
    }
  })
  // Only change code above this line
  return arr;
}

// 多属性测试用例(当前代码无法通过)
whatIsInAName(
  [{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }],
  { "apple": 1, "bat": 2 }
);
// 预期输出 [{ "apple": 1, "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }]

// 单属性测试用例(当前代码可通过)
whatIsInAName(
  [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],
  { last: "Capulet" }
);
// 预期输出 [{ first: "Tybalt", last: "Capulet" }]

代码问题定位

现有代码仅在源对象仅包含单个属性时可正常运行,多属性场景完全失效,核心原因非常明确:

  • 单属性场景下,propFinder 是类似['last']的单元素数组,用它做对象属性名取值时,JS会自动转成对应的字符串属性名,刚好能取到对应属性的值,所以逻辑能跑通
  • 多属性场景下,propFinder 是类似['apple','bat']的多元素数组,用它做对象属性名取值时,JS会把数组强制转成"apple,bat"这个拼接后的字符串名,集合里的对象根本不存在这个名字的属性,取值永远是undefined,判断条件自然永远不成立
  • 现有逻辑没有针对源对象的每一个键做逐一校验,根本满足不了「源对象的所有键值对都匹配才算合格」的规则要求

修正实现

核心逻辑很直接:遍历集合里的每一个对象,逐一校验源对象的所有键,只要存在一个键不满足「对象有这个键、且键值完全相等」,就把该对象从结果中排除。
可以用数组原生方法简化冗余代码:

  • 用filter替代手动push的map遍历,直接返回符合条件的对象组成的数组
  • 用every方法对源对象的所有键做全量校验,只要有一个键不满足条件,就返回false将对象过滤掉

修正后可直接通过所有测试的代码:

function whatIsInAName(collection, source) {
  const sourceKeys = Object.keys(source);
  // 筛选集合中匹配所有源键值对的对象
  return collection.filter(item => {
    return sourceKeys.every(key => {
      // 确认对象存在该键,且键值和源对象完全一致
      return item.hasOwnProperty(key) && item[key] === source[key]
    })
  })
}

效果验证

  • 多属性测试用例:正确返回两个同时包含apple:1和bat:2的对象
  • 单属性测试用例:正确返回包含last: "Capulet"的对象
  • 兼容边界场景:自动排除对象缺失对应键、键值不相等的情况,完全匹配挑战规则要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 10:06:04