2015-11-19 117 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

相关问题