【问题标题】:how to compare if two objects have the same fields (same schema) [duplicate]如何比较两个对象是否具有相同的字段(相同的模式)[重复]
【发布时间】:2021-03-09 18:40:00
【问题描述】:

我通过 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;
}

这是有效的对象。我只想接受这个 body 的请求,不关心值。

const validObject = {
  country: '',
  name: '',
  zip: '',
  //etc
};

在此之后,我执行一个 if 语句,例如:

if(checkObject(validObject, receivedObject)){
    //do stuff here
}else{
    //reject the request
}

好吧,这行得通,但它太丑陋了。它没有通过 lint 测试并且有太多的 for 循环。你怎么看?有没有其他方法可以做同样的事情? 谢谢!!

【问题讨论】:

  • 首先获取密钥:const keys1 = Object.keys(o1)。接下来,按字母顺序对它们进行排序:keys1.sort((a, b) => a > b)。最后,字符串化:const json1 = JSON.stringify(keys1);。生成的两个字符串应该是相同的。
  • 此外,根据您用于编写 http 端点的库,它可能已经包含一种验证您收到的内容的方法。 Chris G 的想法会很有效。
  • 谢谢你们! @ChrisG 是的,这行得通。

标签: javascript node.js


【解决方案1】:

如果您有兴趣,这里有 JSON schema validation 的规范,还有像 ajv 这样的 JavaScript 实现。

现在我认为这对于您的需要来说太过分了。 checkObject 的实现可以是:

const valid = {
  foo: '',
  bar: ''
}

const okay = {
  bar: '',
  foo: ''
}

const notEnough = {
  foo: ''
}

const tooMuch = {
  foo: '',
  bar: '',
  foobar : ''
}

function checkObject(validObject, receivedObject) {
  const validKeys = Object.keys(validObject);
  const receivedKeys = Object.keys(receivedObject);
  return validKeys.length === receivedKeys.length
    && validKeys.every(value => ~receivedKeys.indexOf(value));
}

console.log(checkObject(valid, okay));
console.log(checkObject(valid, notEnough));
console.log(checkObject(valid, tooMuch));

【讨论】:

  • 如果对象的键顺序不同,则不起作用,例如const okay = {bar: '', foo: ''}
  • @James 感谢您的指出,我已经解决了
【解决方案2】:

这是一个lodash 版本


import _ from "lodash"


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

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2017-07-10
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多