为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript:当其路径未知时,检查嵌套对象中是否存在键

JavaScript:当其路径未知时,检查嵌套对象中是否存在键

暮色呼如 2021-06-01 17:09:32
我正在尝试检查我的对象中是否存在密钥。我不知道密钥可能具体在哪里或在哪个嵌套对象上,我只知道密钥(或属性)的名称。有一个功能可以快速搜索对象并确定对象中是否存在属性键,这对我来说非常方便。为了说明这一点,我的模拟对象将是这样的:const testObject = {  one : {    two : {      three : "hello"    }  }}我希望一个查找键是否存在的函数会返回true一个属性键"three"or "one",并且会返回false一个键"fooBar"我已经尝试过该hasOwnProperty方法,但它失败了。
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

一种方法是使用doesObjectHaveNestedKey()如下所示的递归搜索函数(这不需要像 lodash 这样的额外依赖项):


const object = {

  some : {

    nested : {

      property : {

        to : [

          {

            find : {

              foo : [ 1 , 2 , 3 ]

            }

          }

        ]

      }

    }

  }

}


/* Define function to recursively search for existence of key in obj */

function doesObjectHaveNestedKey(obj, key) {


  if(obj === null || obj === undefined) {

    return false;

  }

  

  for(const k of Object.keys(obj)) {

  

    if(k === key) {

      /* Search keys of obj for match and return true if match found */

      return true

    }

    else {

      const val = obj[k];

      

      /* If k not a match, try to search it's value. We can search through

      object value types, seeing they are capable of containing

      objects with keys that might be a match */

      if(typeof val === 'object') {

      

        /* Recursivly search for nested key match in nested val */

        if(doesObjectHaveNestedKey(val, key) === true) {

          return true;

        }

      }

    }

  }

  

  return false;

}


console.log('has foo?', doesObjectHaveNestedKey(object, 'foo') )        // True

console.log('has bar?', doesObjectHaveNestedKey(object, 'bar') )        // False

console.log('has nested?', doesObjectHaveNestedKey(object, 'nested') )  // True

console.log('has cat?', doesObjectHaveNestedKey(null, 'cat') )          // False

这里的想法是:

  1. 查看输入对象“obj”的键,寻找与输入“key”匹配的键“k”

  2. 如果找到匹配项,则返回 true,否则

  3. 寻找能够存储嵌套对象的“obj”的任何值“val”(探索“Object”类型,因为只有这些可以存储嵌套键)和

  4. 递归搜索这些类型的“val”以进行匹配,如果找到,则返回 true


查看完整回答
反对 回复 2021-06-03
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

Dacre Denny 的答案也可以写成:


  const hasKey = (obj, key) => 

    Object.keys(obj).includes(key) ||

    Object.values(obj)

      .filter(it => typeof it === "object" && it !== null)

      .some(it => hasKey(it, key));


查看完整回答
反对 回复 2021-06-03
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信