Javascript 如果对象为';s键存在于嵌套对象和数组中

Javascript 如果对象为';s键存在于嵌套对象和数组中,javascript,object,Javascript,Object,我尝试使用if(key in object)语句来获取对象中是否存在键,但是我注意到它只适用于对象的第一级,如下所示: myObject = { name: 'Bob', age: 20, dog: true } myObject = { name: 'Joe', favorites: { ice_cream: 'vanilla', coffee: 'espresso' } } 但是,它似乎不适用于这样的嵌套对象: myObject = { nam

我尝试使用
if(key in object)
语句来获取对象中是否存在键,但是我注意到它只适用于对象的第一级,如下所示:

myObject = {
  name: 'Bob',
  age: 20,
  dog: true
}
myObject = {
  name: 'Joe',
  favorites: {
    ice_cream: 'vanilla',
    coffee: 'espresso'
  }
}
但是,它似乎不适用于这样的嵌套对象:

myObject = {
  name: 'Bob',
  age: 20,
  dog: true
}
myObject = {
  name: 'Joe',
  favorites: {
    ice_cream: 'vanilla',
    coffee: 'espresso'
  }
}

如果我运行
console.log('coffee'在myObject中)
,它将返回false。我也尝试过使用
myObject.hasOwnProperty(“coffee”)
,但是它仍然返回false。

如果您真的希望能够递归地检查该键是否存在于对象中的任何位置,则需要一个递归函数

const myObject={
名字:'乔',
收藏夹:{
冰淇淋:“香草”,
咖啡:“浓缩咖啡”
}
};
const getKeys=(obj,keys=[],visted=new Set())=>{
如果(访问过的对象)返回;
添加(obj);
keys.push(…Object.keys(obj));
for(对象值的常量值(obj)){
if(val&&typeof val=='object'){
获取密钥(val、密钥、已访问);
}
}
返回键;
};
log(getKeys(myObject));
log(getKeys(myObject).包括('coffee')你可以试试这个

function getKey(obj) {
    let objectKeys = [];
    let keyValues = Object.entries(obj);
    for (let i in keyValues) {
        objectKeys.push(keyValues[i][0]);
        if (typeof keyValues[i][1] == "object") {
            var keys = getKey(keyValues[i][1])
            objectKeys = objectKeys.concat(keys);
        }
    }
    return objectKeys;
}
您可以将键传递给函数并检查

 let key = getKey(coffee);
 console.log(key);

这回答了你的问题吗?您认为检查密钥是否存在的最佳方法是什么?我正在处理一个相当大的对象,它是Minecraft中一个项目的解码NBT,不同的项目有不同的字段,所以我不能只写对每个项目都有效的相同的东西。事先弄清楚对象的结构可以是什么样的,这样你就可以直接找到你想要找到的可能属性。这可能涉及数组或对象方法-这很好-但在整个对象上一直迭代是对输入了解不够的标志。