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

我正在尝试检查我的对象中是否存在密钥。


我不知道密钥可能具体在哪里或在哪个嵌套对象上,我只知道密钥(或属性)的名称。有一个功能可以快速搜索对象并确定对象中是否存在属性键,这对我来说非常方便。


为了说明这一点,我的模拟对象将是这样的:


const testObject = {

  one : {

    two : {

      three : "hello"

    }

  }

}

我希望一个查找键是否存在的函数会返回true一个属性键"three"or "one",并且会返回false一个键"fooBar"


我已经尝试过该hasOwnProperty方法,但它失败了。


暮色呼如
浏览 191回答 2
2回答

慕码人8056858

一种方法是使用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') )        // Trueconsole.log('has bar?', doesObjectHaveNestedKey(object, 'bar') )        // Falseconsole.log('has nested?', doesObjectHaveNestedKey(object, 'nested') )  // Trueconsole.log('has cat?', doesObjectHaveNestedKey(null, 'cat') )          // False这里的想法是:查看输入对象“obj”的键,寻找与输入“key”匹配的键“k”如果找到匹配项,则返回 true,否则寻找能够存储嵌套对象的“obj”的任何值“val”(探索“Object”类型,因为只有这些可以存储嵌套键)和递归搜索这些类型的“val”以进行匹配,如果找到,则返回 true

回首忆惘然

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));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript