2015-11-19 72 views
0

我有兩個JS對象,我想檢查第一個對象是否有第二個對象的鍵做某些事情,否則拋出異常。什麼是最好的方式來做到這一點?檢查JavaScript對象的最佳方法擁有另一個JavaScript對象的所有關鍵字

function(obj1, obj2){ 
    if(obj1.HasAllKeys(obj2)) { 
     //do something 
    } 
    else{ 
     throw new Error(...); 
    } 
}; 

例如,在自FirstObject下面的例子有所有SecondObject的關鍵它應該運行的代碼:

FirstObject 
{ 
    a : '....', 
    b : '...', 
    c : '...', 
    d : '...' 
} 
SecondObject 
{  
    b : '...',  
    d : '...' 
} 

但在下面的例子我想既然XXX犯規在FirstObject存在拋出一個異常:

FirstObject 
{ 
    a : '....', 
    b : '...', 
    c : '...', 
    d : '...' 
} 
SecondObject 
{  
    b : '...',  
    XXX : '...' 
} 

回答

5

您可以使用:

var hasAll = Object.keys(obj1).every(function(key) { 
    return Object.prototype.hasOwnProperty.call(obj2, key); 
}); 
console.log(hasAll); // true if obj2 has all - but maybe more - keys that obj1 have. 

作爲 「一個班輪」:

var hasAll = Object.keys(obj1).every(Object.prototype.hasOwnProperty.bind(obj2)); 
+0

任何原因使用'.call'而不是'obj.hasOwnProperty(key)'? – Barmar

+0

@Barmar請參閱:請參閱:https://stackoverflow.com/questions/12017693/why-use-object-prototype-hasownproperty-callmyobj-prop-instead-of-myobj-hasow – andlrc

+0

嗯,它似乎創建一個對象不從'對象'繼承是一個災難的食譜.... – Barmar

5

您可以編寫一個函數來遍歷和檢查:

function hasAllKeys(requiredObj, secondObj) { 
    for (var key in requiredObj) { 
     if (!secondObj.hasOwnProperty(key)) { 
      return false; 
     } 
    } 

    return true; 
} 

hasAllKeys(SecondObject, FirstObject); 
+0

我想要像Python一樣在一行:),我們可以避免循環和逐一檢查? – Am1rr3zA

+0

Javascript沒有列表解析功能,對於像這樣的東西製作單行棋很難。 – Barmar

+0

@ Am1rr3zA即使你看不到迭代,它們仍然在發生,如果有的話,tymeJV提供的解決方案是最快的。 – andlrc

0

您可以使用jQuery的$.map方法如下:
$.map(a,function(value, key) {return b[key];}).length != b.length

+0

在原始問題明顯尋找普通JavaScript時使用框架通常是不被接受的(特別是對於像這樣微不足道的東西),再加上,鑑於拼寫錯誤,您顯然沒有對它進行測試。答案應該被測試,或者至少你應該提到你沒有測試它,爲什麼。 – blm

相關問題