2015-04-05 75 views
-1

我有三个对象,object1:{a: 1, b: 2}; object2:{a: 1, b: 3}; object3:{a: 1, b: 2, c: 3},并且希望将最后两个与第一个进行比较,并且只在它们相等时才返回它们(只要它包含的键彼此相等,它们的值就越多就无关紧要)。测试对象是否相等和/或对象是否有更多按键,但仍等于共用的对象

所以,我想要返回object3。

+0

您可能想要更改您的问题。 “平等”并不意味着你在说什么。你正在寻找的是所谓的“统一”:你想找到哪些对象可以与第一个统一。 – Touffy 2015-04-05 14:12:05

+0

谢谢,我不知道那个字;现在我知道要搜索什么。 – Mobilpadde 2015-04-05 14:33:17

+0

更准确地说,*统一*两个对象不仅仅是做比较,它意味着创建一个包含两者的所有属性的对象。但只有在两个对象中具有相同名称的属性具有相同的值(对象是* unifiable *)时才有可能。 – Touffy 2015-04-05 14:48:04

回答

0

比较c您可以检查在a每个键从b或者不存在或具有相同的值使用Array#all

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

这是没有必要显式检查的keyb存在,因为如果b不包含key然后b[key]是未定义的,这将不等于在akey任何值。

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

如果你想NaN被认为是平等的,你必须单独检查。

这将简单地检查两个对象是否可以一致。要真正统一他们,只要你想,一个简单的想法是

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

Object.assign可以通过$.extend_.extendEmber.merge,或您喜爱的其他物体合并所取代。

+0

我会接受你的答案,因为引用下划线,这帮助我做我想要实现的。 (使用'_.isMatch') – Mobilpadde 2015-04-05 18:58:48

+0

关于NaN和undefined的好处。您可以使用'Object.getOwnPropertyNames'而不是'keys()'来避免继承的属性。另外,请记住,这与我们发布的所有其他答案一样浅。 – Touffy 2015-04-06 05:08:25

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 
} 
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} 

A和B具有

copareobjectkeys(c,a) //true 
copareobjectkeys(b,a) //false 
+0

代码中的'!! b [k]'条件将阻止检测与'b'中的任何falsy值的冲突。 – Touffy 2015-04-05 14:43:47

+0

@Touffy不,它会确保它是比较当且仅当b也有该密钥 – 2015-04-05 15:44:50

+0

我认为后b.hasOwnProperty(k)我不需要 – 2015-04-05 15:47:27

相关问题