当前,我正在尝试获取对象的所有键,包括子对象。
我知道
Object.keys(obj)
返回对象的键,但不返回对象内部的键。
例如,我得到了以下对象:
let exampleObject =
{
a: "value",
b: "value",
c: 404,
d: {
e: "value",
f: "value"
}
}
注意:: d 键可能会更改其名称,因此使用 Object.keys(obj.d)之类的键将无效。 em>。
如何在对象内存在的总键列表中获取 e 和 f ?
答案 0 :(得分:4)
您可以使用flatMap
递归地获取这样的密钥:
let exampleObject={a:"value",b:"value",c:404,d:{e:"value",f:"value"}};
const getKeys = obj => Object.keys(obj).flatMap(k => Object(obj[k]) === obj[k]
? [k, ...getKeys(obj[k])]
: k)
console.log(getKeys(exampleObject))
如果不支持flatMap
,请像这样使用reduce
:
function getKeys(obj) {
return Object.keys(obj).reduce((r, k) => {
r.push(k);
if(Object(obj[k]) === obj[k])
r.push(...getKeys(obj[k]));
return r;
}, [])
}
Object(obj[k]) === obj[k]
检查该属性是否是对象,而不是null
。因为typeof null === "object"
答案 1 :(得分:2)
您可以尝试使用递归。
getAllKeys()
,并在其中创建一个空数组。getKeys()
,该函数接受对象并将被递归调用。getKeys()
内部,使用for..in
遍历键。 push()
将该键放入包装函数中创建的空数组中。 typeof
键是否为"object"
,然后对此进行递归调用。
let exampleObject =
{
a: "value",
b: "value",
c: 404,
d: {
e: "value",
f: "value"
}
}
function getAllKeys(obj){
let res = []
function getKeys(obj){
for(let key in obj){
res.push(key);
if(typeof obj[key] === "object"){
getKeys(obj[key])
}
}
}
getKeys(obj);
return res;
}
console.log(getAllKeys(exampleObject))