Javascript 比较两个对象的值

Javascript 比较两个对象的值,javascript,Javascript,比较两个对象,仅当两个值相同时才返回true。如果它们是两个以上相同的值或全部或无返回false。 例如: A和B应该返回true,因为A.A和B.A是相同的。 A和C应该返回false,因为A.A和C.A以及A.b和C.b是相同的 到目前为止,我有这个功能: 但是在这种情况下,const ObB7返回true,应该为false 这个功能可以简化吗 函数比较对象(ObA、ObB){ 常数{a,b,c}=ObA; 常数{a:d,b:e,c:f}=ObB; 如果( ((a==d&&(a!==e&

比较两个对象,仅当两个值相同时才返回true。如果它们是两个以上相同的值或全部或无返回false。 例如:

A和B应该返回true,因为A.A和B.A是相同的。 A和C应该返回false,因为A.A和C.A以及A.b和C.b是相同的

到目前为止,我有这个功能:

但是在这种情况下,
const ObB7
返回true,应该为false

这个功能可以简化吗

函数比较对象(ObA、ObB){
常数{a,b,c}=ObA;
常数{a:d,b:e,c:f}=ObB;
如果(
((a==d&&(a!==e&&a!==f))
||(a==e&&(a!==d&&a!==f))
||(a==f&&(a!==e&&a!==d)))
||((b==d&&(b!==e&&b!==f))
||(b==e&&(b!==d&&b!==f))
||(b==f&&(b!==e&&b!==d)))
||((c==d&&(c!==e&&c!==f))
||(c==e&&(c!==d&&c!==f))
||(c==f&&(c!==e&&c!==d)))
) {
返回true;
}
返回false;
}
常数={a:1,b:2,c:3};
常数ObB0={a:4,b:5,c:6};//错
常量ObB1={a:4,b:4,c:4};//错
常量ObB2={a:1,b:1,c:1};//错
常数ObB3={a:2,b:2,c:2};//错
常数ObB4={a:3,b:3,c:3};//错
常数ObB5={a:1,b:1,c:7};//错
常量ObB6={a:7,b:2,c:2};//错
常量ObB7={a:7,b:3,c:3};//错
常量ObB8={a:2,b:3,c:4};//应该是假的
常量ObB9={a:3,b:7,c:3};//错
常量ObB10={a:5,b:2,c:3};//对
常量ObB11={a:1,b:5,c:6};//对
常量ObB12={a:0,b:5,c:3};//对
log(比较对象(ObA,ObB0));
log(比较对象(ObA,ObB1));
log(比较对象(ObA,ObB2));
log(比较对象(ObA,ObB3));
log(比较对象(ObA,ObB4));
log(比较对象(ObA,ObB5));
log(比较对象(ObA,ObB6));
log(比较对象(ObA,ObB7));
log(比较对象(ObA,ObB8));
log(比较对象(ObA,ObB9));
log(比较对象(ObA,ObB10));
log(比较对象(ObA,ObB11));
log(比较对象(ObA,ObB12))您可以使用

这是我的想法

  • 获取一个对象的关键点
  • 如果两个对象的值按
    1
    的增量相等,并且如果不是只返回
    op
    而不做任何更改,则为每个键匹配两个对象的值
  • 最后只需检查
    op==2
    return
    true
    else是否返回
    false
设A={A:1,b:2,c:3};
设B={a:1,B:5,c:7};
设C={a:1,b:2,C:7};
让我们比较一下=(a,b)=>{
设op=Object.keys(a).reduce((op,inp)=>{
if(a[inp]==b[inp]){
op++
}返回op;
},0)
返回op==2?真:假
}
console.log(比较(A,B))
console.log(比较(A,C))

log(compare(C,A))
您可能希望在那里查看:可以简化您当前的尝试。ObB10不应该为false吗?我不明白为什么在不比较键的情况下使用对象。@Rice\u crip你是对的,ObB10应该是假的为什么减少,为什么不使用forEach或一些?@mplungjan yes forEach可以使用。但是我不确定在这种情况下你将如何使用
some
,也许不是const A={A:1,b:2,c:3};常数B1={a:5,b:2,c:3};常数B2={a:1,b:5,c:6};常数B3={a:0,b:5,c:3};log(compare(A,B1))-返回true,应该为false;log(compare(A,B2))-返回false,并且应该为true;log(compare(A,B3))-返回false,并且应该为true;在OPs数据上试一试?使用代码段编辑器
返回匹配===1
应该是
返回匹配===2
。另外,如果帖子能解释代码的作用,那就太好了。:)不,根据我从问题中收集到的信息,应该只有一对匹配。但是第二个例子似乎与他在第一个例子中所说的相反,所以谁知道呢;常数B1={a:1,b:1,c:1};常数B2={a:1,b:1,c:7};-B1和B2也应该为false,值可以只出现一次,这里值1出现的次数更多我只是稍微修改了你的函数,现在正如我所期望的那样工作,但这仍然是你的逻辑,我接受答案。
A = {a: 1, b: 2, c: 3};
B = {a: 1, b: 5, c: 7};
C = {a: 1, b: 2, c: 7};
function compareTwoObjects(a, b) {
  let matches = 0
  Object.keys(a).forEach(key => {
    if (b[key] && b[key] === a[key]) {
      matches++
    }
  })
  return matches === 1
}