测试对象是否相等和/或对象是否有更多的键但仍然等于共同的键

时间:2015-04-05 13:51:42

标签: javascript

我有三个对象,object1:{a: 1, b: 2}; object2:{a: 1, b: 3}; object3:{a: 1, b: 2, c: 3},并希望将最后两个与第一个进行比较,并且只有在它们相等时才返回它们(如果它包含的值多于它包含的键等于彼此)。

所以,就像,我想要返回object3。

3 个答案:

答案 0 :(得分:0)

你去了(但请修正你的问题)。这需要两个参数并返回它们是否可以统一(即它们共有的属性是否具有相同的值)。尽管如此,它只是做了一个浅薄的比较。让它进行深度比较递归是留给读者的练习;)

function unifiable(a, b){
  for(var prop in a) if(a.hasOwnProperty(prop)
      && b.hasOwnProperty(prop) && a[prop] !== b[prop])
    return false
  return true // will happen if the loop ended without returning
}

答案 1 :(得分:0)

你可以使用这个功能

制作一个

的功能
  • 检查自己的财产
  • 检查对象a的属性是否存在于对象b
  • 最终将第一个对象的属性与属性相匹配 第二个对象。

     function copareobjectkeys(a,b)
     {
         for(var k in a)
         {
    
          if(a.hasOwnProperty(k) && b.hasOwnProperty(k)  && b[k]!=a[k])
             return false;
         }
     return true
    }
    

现在拥有这三个对象

a ={a: 1, b: 2};
b= {a: 1, b: 3}; 
c= {a: 1, b: 2, c: 3}

将c与a和b与

进行比较
copareobjectkeys(c,a) //true
copareobjectkeys(b,a) //false

答案 2 :(得分:0)

您可以使用a检查b中的每个密钥是否不在Array#all或具有相同的值:

function unifiable(a, b) {
    return Object.keys(a) . all(function(key) { return a[key] === b[key]; }); 
}

没有必要明确检查key中是否存在b,因为如果b不包含key,那么b[key]将是未定义的,它不等于keya的任何值。

以上内容会在key的原型链中找到b的值,因此如果这是一个问题,您需要对b.hasOwnProperty(key)进行明确检查。

如果您希望NaN被视为相同,则必须单独检查。

这将简单地检查这两个对象是否是可以统一的。要按照自己的意愿实际统一它们,一个简单的想法就是

unifiable(a, b) && Object.assign(a, b)

Object.assign可以替换为$.extend_.extendEmber.merge或您最喜欢的其他对象合并。