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

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

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

DIEA 2019-04-18 18:15:28
我正在尝试检查我的对象中是否存在密钥。我不知道密钥可以在哪个或哪个嵌套对象上具体,我只知道密钥(或属性)的名称。拥有一个允许快速搜索对象并确定对象中是否存在属性键的函数对我来说非常方便。为了说明这一点,我的模拟对象将是这样的:const testObject = {   one : {     two : {       three : "hello"     }   }}我希望找到一个密钥存在的函数将返回或true的属性密钥,并返回密钥"three""one"false"fooBar"我尝试过该hasOwnProperty方法,但失败了。
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

一种方法是使用递归搜索函数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) {

  

  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

这里的想法是:

  1. 通过输入对象“obj”的键查找与输入“key”匹配的键“k”

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

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

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


查看完整回答
反对 回复 2019-05-17
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

Dacre Denny的答案也可以写成:

  const hasKey = (obj, key) => 
    Object.keys(obj).includes(key) ||
    Object.values(obj)
      .filter(it => typeof it === "object")
      .some(it => hasKey(it, key));


查看完整回答
反对 回复 2019-05-17
  • 3 回答
  • 0 关注
  • 431 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号