如何判断两个JavaScript对象是否存在相同的键值对?
判断两个对象是否存在匹配的键值对
嘿,我来帮你搞定这个问题!你的需求是写一个函数,当两个JavaScript对象存在至少一组相同的键值对时返回true,对吧?咱们先看看现有代码的问题,再给出靠谱的实现:
现有代码的问题
你当前把对象转成JSON字符串的思路不太合适:因为对象的键在JSON序列化后的顺序可能不一致(虽然ES6+里对象键的顺序有规则,但依赖这个并不稳妥),而且这种方式没法精准检查单个键值对的匹配情况。
正确的函数实现
我们可以通过遍历对象的键,逐一检查对应的值是否相等来实现需求:
const hasMatchingKeyValuePair = function(obj1, obj2) { // 遍历第一个对象的所有自身属性键 for (const key in obj1) { // 确保键是对象自身的,并且另一个对象有相同键且值相等 if (obj1.hasOwnProperty(key) && obj2.hasOwnProperty(key) && obj2[key] === obj1[key]) { return true; } } // 遍历完所有键都没找到匹配,返回false return false; };
代码解释
- 用
for...in遍历第一个对象的键,搭配hasOwnProperty可以避免遍历到原型链上的继承属性,保证只检查对象自身的键值对。 - 每遍历一个键,就检查第二个对象是否拥有相同的键,并且两个对象该键对应的值严格相等(
===)。 - 一旦找到一组匹配的键值对,立刻返回
true,不用继续遍历,提升效率。 - 如果遍历完所有键都没找到匹配,就返回
false。
测试你的示例
把你的示例对象代入函数测试,结果符合预期:
let obj1 = { toyota: 'yellow', honda: 'silver', mazda: 'black' }; let obj2 = { nissan: 'black', bmw: 'yellow', honda: 'silver' }; console.log(hasMatchingKeyValuePair(obj1, obj2)); // 输出:true
额外说明
如果你的对象值包含引用类型(比如嵌套对象、数组),===只会对比引用地址,这时候需要递归检查或者用深度对比的方法。如果你的场景里值都是字符串、数字这类基本类型,上面的代码就完全够用啦。
内容的提问来源于stack exchange,提问作者learningfan
相关产品推荐
相关产品推荐

