我有三個對象,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