检查JavaScript对象的最佳方法是拥有另一个JavaScript对象的所有键

Best way to Check a JavaScript Object has all the keys of another JavaScript Object

本文关键字:对象 JavaScript 另一个 方法 最佳 检查 拥有      更新时间:2023-09-26

我有两个JS对象,我想检查第一个对象是否有第二个对象的所有键,然后做一些事情,否则,抛出一个异常。最好的方法是什么?

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 : '...'
}

您可以使用:

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));

您可以编写一个函数来迭代和检查:

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

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

另一种方法似乎也很好。

   const o1 = {
              a : '....',
              b : '...',
              c : '...',
              d : '...'
            },
         o2 = {
             b : '...',
             d : '...',
          };
///////////////////////
///// I. IN ONE LINE
///////////////////////
/**/
/**/  if(Object.keys(o2).every(key =>
/**/       key in o1
/**/       // Object.keys(o1).includes(key)
/**/       // Object.keys(o1).filter(x => x==key).length
/**/  ))
/**/  console.log(true);
/**/  else throw new Error("...");
/**/
///////////////////////

///////////////////////
///// II. IN A FUNCTION
///////////////////////
/**/
/**/    var hasAll = (o1 , o2) => {
/**/      let r = Object.keys(o2).every(key =>
/**/        // Object.keys(o1).includes(key)
/**/        // key in o1
/**/        // Object.keys(o1).filter(x => x==key).length
/**/
/**/         Object.keys(o1)
/**/         .reduce((acc,act,arr) =>
/**/            acc && (key in o1) // , true
/**/         )
/**/
/**/      );
/**/      return r;
/**/    }
/**/
/**/ let cond = hasAll(o1 , o2);
/**/
/**/ console.log(cond);
/**/
/**/ if (cond) console.log(true)
//   /**/ else throw new Error("At least, one key doesn'e exist");
/**/
/**/ ////////
/**/
/**/ cond = hasAll(o2 , o1);
/**/
/**/ console.log(cond);
/**/
/**/ if (cond) console.log(true)
/**/ else throw new Error("At least, one key doesn'e exist");
/**/
///////////////////////