获取对象的键是否存在于嵌套对象和数组中



我正试图使用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);

最新更新