我正试图使用if (key in object)
语句来获取对象中是否存在键,但我注意到它只适用于对象的第一级,如下所示:
myObject = {
name: 'Bob',
age: 20,
dog: true
}
然而,它似乎不适用于这样的嵌套对象:
myObject = {
name: 'Joe',
favorites: {
ice_cream: 'vanilla',
coffee: 'espresso'
}
}
如果我运行console.log('coffee' in myObject)
,它将返回false。我也尝试过使用myObject.hasOwnProperty('coffee')
,但是它仍然返回false。
如果您真的希望能够递归地检查键是否存在于对象内的任何位置,那么您需要一个递归函数。
const myObject = {
name: 'Joe',
favorites: {
ice_cream: 'vanilla',
coffee: 'espresso'
}
};
const getKeys = (obj, keys = [], visited = new Set()) => {
if (visited.has(obj)) return;
visited.add(obj);
keys.push(...Object.keys(obj));
for (const val of Object.values(obj)) {
if (val && typeof val === 'object') {
getKeys(val, keys, visited);
}
}
return keys;
};
console.log(getKeys(myObject));
console.log(getKeys(myObject).includes('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);