【问题标题】:How to check for deep object property [duplicate]如何检查深层对象属性[重复]
【发布时间】:2021-05-04 22:21:39
【问题描述】:

我正在处理在对象深处寻找属性的某些困难。以下是一些场景:

{ redacted: true } vs { someProperty: true, anotherProperty: { redacted: true } }

我希望能够在任何对象级别找到redacted 键。我试图在库lodash 中找到一些解决方案,但没有成功。

用这个接口实现一些东西会很棒: findDeepProperty(obj, 'redacted')

另外,有没有办法通过使用像lodash这样的外部库来实现这个算法?

【问题讨论】:

  • 从概念上讲,如果您不知道它的上下文,那么获取值的意义何在?查找 obj.data.redactedobj.parent.redacted 可能有非常不同的含义。实际上,预期的结果是什么?只是价值?还是路径和价值?如果有多个匹配项怎么办?你想要什么结果?
  • 某些值比较复杂,例如:{ salary: { amount: { redacted: true }, currency: "R$" } } 与对象级别无关,必要的逻辑只是检查redacted键是否存在 不可能有多个匹配 - 这是一个设计规则
  • 但是你知道该属性应该在哪里。明白了:console.log(obj.salary.amount.redacted != undefined); 如果这是关于处理路径上的空检查,比如让我们说salaryundefined。查看optional chaining operator。喜欢console.log(obj.salary?.amount.redacted != undefined);
  • @Thomas 并不总是那么简单。我必须先使用递归深度搜索

标签: javascript data-structures


【解决方案1】:

首先,这是一个非常有趣的问题。我设法用纯 JavaScript 创建了一个可行的解决方案,因此您不必导入任何第三方库,例如 lodash。它将尝试查找具有给定名称的property 作为对象中的输入。它将使用来自How to check the depth of an object? 的算法来遍历每个深度的对象。如果找到它,它将返回该属性的值。如果找不到它,它将返回一个空对象。这是sn-p:

let object = {
  'key1': {
    'key2': 'value2'
  },
  'key3': {
    'key4': {
      'key5': 'value5'
    },
  },
}

findDeepProperty = function(object, query_key) {
  for (let key in object) {
    if (key === query_key) {
      return object[key];
    }
    if (!object.hasOwnProperty(key)) continue;
    if (typeof object[key] == 'object') {
      let sub_result = findDeepProperty(object[key], query_key);
      if (Object.keys(sub_result).length) return sub_result;
    }
  }
  return {};
}

console.log(findDeepProperty(object, 'key3'))

【讨论】:

  • 如果key1 包含一个对象怎么办?
  • 它将检查该对象是否具有query_property
  • 我用那个例子更新了 sn-p。
猜你喜欢
  • 2013-11-28
  • 2020-11-21
  • 1970-01-01
  • 2013-03-16
  • 2013-12-17
  • 2020-05-08
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多