我有三个对象,object1:{a: 1, b: 2}
; object2:{a: 1, b: 3}
; object3:{a: 1, b: 2, c: 3}
,并且希望将最后两个与第一个进行比较,并且只在它们相等时才返回它们(只要它包含的键彼此相等,它们的值就越多就无关紧要)。测试对象是否相等和/或对象是否有更多按键,但仍等于共用的对象
所以,我想要返回object3。
我有三个对象,object1:{a: 1, b: 2}
; object2:{a: 1, b: 3}
; object3:{a: 1, b: 2, c: 3}
,并且希望将最后两个与第一个进行比较,并且只在它们相等时才返回它们(只要它包含的键彼此相等,它们的值就越多就无关紧要)。测试对象是否相等和/或对象是否有更多按键,但仍等于共用的对象
所以,我想要返回object3。
比较c您可以检查在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]
是未定义的,这将不等于在a
的key
任何值。
以上将在b
的原型链中找到key
的值,所以如果这是个问题,您需要对b.hasOwnProperty(key)
进行明确检查。
如果你想NaN
被认为是平等的,你必须单独检查。
这将简单地检查两个对象是否可以一致。要真正统一他们,只要你想,一个简单的想法是
unifiable(a, b) && Object.assign(a, b)
凡Object.assign
可以通过$.extend
,_.extend
,Ember.merge
,或您喜爱的其他物体合并所取代。
我会接受你的答案,因为引用下划线,这帮助我做我想要实现的。 (使用'_.isMatch') – Mobilpadde 2015-04-05 18:58:48
关于NaN和undefined的好处。您可以使用'Object.getOwnPropertyNames'而不是'keys()'来避免继承的属性。另外,请记住,这与我们发布的所有其他答案一样浅。 – Touffy 2015-04-06 05:08:25
在这里你去(但请解决你的问题)。这需要两个参数并返回它们是否可以统一(即它们共有的属性是否具有相同的值)。这只是做一个浅层比较。使其递归深比较作为练习留给读者;)
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
}
您可以使用此功能
使一个功能
最终将第一个对象的属性与属性第二个对象的。
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
代码中的'!! b [k]'条件将阻止检测与'b'中的任何falsy值的冲突。 – Touffy 2015-04-05 14:43:47
@Touffy不,它会确保它是比较当且仅当b也有该密钥 – 2015-04-05 15:44:50
我认为后b.hasOwnProperty(k)我不需要 – 2015-04-05 15:47:27
您可能想要更改您的问题。 “平等”并不意味着你在说什么。你正在寻找的是所谓的“统一”:你想找到哪些对象可以与第一个统一。 – Touffy 2015-04-05 14:12:05
谢谢,我不知道那个字;现在我知道要搜索什么。 – Mobilpadde 2015-04-05 14:33:17
更准确地说,*统一*两个对象不仅仅是做比较,它意味着创建一个包含两者的所有属性的对象。但只有在两个对象中具有相同名称的属性具有相同的值(对象是* unifiable *)时才有可能。 – Touffy 2015-04-05 14:48:04