Javascript 如何比较两个对象是否具有相同的字段(相同的架构)

Javascript 如何比较两个对象是否具有相同的字段(相同的架构),javascript,node.js,Javascript,Node.js,我通过HTTP请求接收JSON对象。我只想检查该对象是否只有我想要的字段,不需要检查它们的值。 我这样做: function checkObject(o1, o2) { for (const p1 in o1) { for (const p2 in o2) { if (o1.hasOwnProperty(p2) === false) { return false; } if (o2.hasOwnProperty(p1) === f

我通过HTTP请求接收JSON对象。我只想检查该对象是否只有我想要的字段,不需要检查它们的值。 我这样做:

function checkObject(o1, o2) {
  for (const p1 in o1) {
     for (const p2 in o2) {
      if (o1.hasOwnProperty(p2) === false) {
        return false;
      }
      if (o2.hasOwnProperty(p1) === false) {
        return false;
      }
    }
   }
  return true;
}
这是有效的对象。我只想接受这个机构的请求,不关心这些值

const validObject = {
  country: '',
  name: '',
  zip: '',
  //etc
};
在此之后,我执行一个if语句,如:

if(checkObject(validObject, receivedObject)){
    //do stuff here
}else{
    //reject the request
}
好吧,这很管用,但太难看了。它没有通过皮棉测试,并且有太多的毛圈。你怎么认为?有没有其他方法可以做同样的事情?
谢谢

如果您感兴趣,这里有一个规范,并且有类似JavaScript的实现

现在我觉得这对你来说太过分了。
checkObject
的实现可以是:

常量有效={
福:'',
栏:“”
}
常数OK={
酒吧:'',
foo:“”
}
常数notEnough={
foo:“”
}
常数太多={
福:'',
酒吧:'',
foobar:'
}
函数检查对象(validObject、ReceiveObject){
const validKeys=Object.key(validObject);
const receivedKeys=Object.keys(receivedObject);
返回validKeys.length==receivedKeys.length
&&validKeys.every(value=>~receivedKeys.indexOf(value));
}
log(checkObject(valid,ok));
log(checkObject(valid,notEnough));

log(checkObject(有效,太多))如果您感兴趣,这里有一个规范,并且有类似JavaScript的实现

现在我觉得这对你来说太过分了。
checkObject
的实现可以是:

常量有效={
福:'',
栏:“”
}
常数OK={
酒吧:'',
foo:“”
}
常数notEnough={
foo:“”
}
常数太多={
福:'',
酒吧:'',
foobar:'
}
函数检查对象(validObject、ReceiveObject){
const validKeys=Object.key(validObject);
const receivedKeys=Object.keys(receivedObject);
返回validKeys.length==receivedKeys.length
&&validKeys.every(value=>~receivedKeys.indexOf(value));
}
log(checkObject(valid,ok));
log(checkObject(valid,notEnough));
log(checkObject(有效,太多))这是一个版本

这是一个版本


首先获取键:
constkeys1=Object.keys(o1)
。接下来,按字母顺序对它们进行排序:
keys1.sort((a,b)=>a>b)
。最后,stringify:
constjson1=JSON.stringify(keys1)。生成的两个字符串应该是相同的。此外,根据您用于编写http端点的库,它可能已经包含验证您接收的内容的方法。克里斯·G的主意会很管用的。重复:cc@GuerricPThak,伙计们@ChrisG是的,这很有效。首先获取键:
constkeys1=Object.keys(o1)
。接下来,按字母顺序对它们进行排序:
keys1.sort((a,b)=>a>b)
。最后,stringify:
constjson1=JSON.stringify(keys1)。生成的两个字符串应该是相同的。此外,根据您用于编写http端点的库,它可能已经包含验证您接收的内容的方法。克里斯·G的主意会很管用的。重复:cc@GuerricPThak,伙计们@ChrisG是的,这是有效的。如果对象的键顺序不同,则不起作用,例如
const-ok={bar:'',foo:'}
@詹姆斯谢谢你指出,我已经修复了如果对象的键顺序不同则不起作用的问题,例如
const-ok={bar:'',foo:'}
@詹姆斯谢谢你指出,我已经修复了

import _ from "lodash"


function checkObject(o1,o2){
  return !_(o1).keys().intersection(_.keys(o2)).isEmpty();
}