【问题标题】:How to check if an object has certain properties [duplicate]如何检查对象是否具有某些属性[重复]
【发布时间】:2021-03-22 16:56:35
【问题描述】:

我有一个带有一些非常特定键的对象。如何检查另一个对象是否具有完全相同的键? 例如:

let myOb = {
  name: "somebody",
  class: {
    number: 9,
    section: "C"
  },
  address: {
    house: 22,
    street: "Eg street"
    PIN: 7893
  }
}

if (newOb.containsAll(myOb)) { // this is just a replacement function
  // do stuff
}

我想将newObmyOb 匹配,看看它们是否有确切的键。所以,newOb 应该有一个nameclassaddressnewOb.class 应该有 numbersectionnewOb.address 应该有 housestreetPIN

我已经知道hasOwnProperty()。我想知道在涉及多个键的情况下是否有更简单的方法。

【问题讨论】:

  • 发帖前请search。更多关于搜索here。请参阅链接问题以及stackoverflow.com/questions/27509/…typeof
  • @T.J.Crowder 我已经看到了。我想知道如果涉及多个键,是否有更简单的方法来做到这一点。如果有请告诉我。

标签: javascript object key


【解决方案1】:

您可以比较两个对象的(递归)键集。

const
  myObjA = {
    name: "somebody",
    class: { number: 9, section: "C" },
    address: { house: 22, street: "Eg street", PIN: 7893 }
  },
  myObjB = {
    name: "somebody else",
    class: { number: 1, section: "A" },
    address: { house: 11, street: "Another st", PIN: 0000 }
  };

// Adapted from: https://stackoverflow.com/a/53620876/1762224
const gatherKeys = obj => {
  const
    isObject = val => typeof val === 'object' && !Array.isArray(val),
    addDelimiter = (a, b) => a ? `${a}.${b}` : b,
    paths = (obj = {}, head = '') => Object.entries(obj)
      .reduce((product, [key, value]) =>
        (fullPath => isObject(value)
          ? product.concat(paths(value, fullPath))
          : product.concat(fullPath))
        (addDelimiter(head, key)), []);
  return new Set(paths(obj));
};

const
  diff = (a, b) => new Set(Array.from(a).filter(item => !b.has(item))),
  equalByKeys = (a, b) => diff(gatherKeys(a), gatherKeys(b)).size === 0;

console.log(equalByKeys(myObjA, myObjB));
.as-console-wrapper { top: 0; max-height: 100% !important; }

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2013-12-26
    • 2014-05-08
    • 2017-10-09
    • 1970-01-01
    • 2017-01-09
    • 2015-08-24
    相关资源
    最近更新 更多