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

