gpt4 book ai didi

javascript - 如何从嵌套对象中获取所有具有值的键

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:30:11 26 4
gpt4 key购买 nike

我正在寻找类似于 Object.keys 但适用于潜在嵌套对象的东西。它也不应该包含具有对象/数组值的键(它应该只包含具有直接字符串/数字/ bool 值的键)。

例子A

输入

{
"check_id":12345,
"check_name":"Name of HTTP check",
"check_type":"HTTP"
}

预期输出

[
"check_id",
"check_name",
"check_type"
]

Object.keys 适用于像这样的平面案例,但不适用于嵌套案例:

例子B

输入

{
"check_id":12345,
"check_name":"Name of HTTP check",
"check_type":"HTTP",
"tags":[
"example_tag"
],
"check_params":{
"basic_auth":false,
"params":[
"size"
],
"encryption": {
"enabled": true,
}
}
}

预期输出

[
"check_id",
"check_name",
"check_type",
"check_params.basic_auth",
"check_params.encryption.enabled"
]

请注意,这不包括 tagscheck_paramscheck_params.paramscheck_params.encryption,因为这些值是数组/对象。

问题

是否有库可以执行此操作?您将如何实现它以便它可以处理任何对象,无论是大对象还是嵌套对象?

最佳答案

你可以像这样使用 reduce:

const keyify = (obj, prefix = '') => 
Object.keys(obj).reduce((res, el) => {
if( Array.isArray(obj[el]) ) {
return res;
} else if( typeof obj[el] === 'object' && obj[el] !== null ) {
return [...res, ...keyify(obj[el], prefix + el + '.')];
}
return [...res, prefix + el];
}, []);

const input = {
"check_id":12345,
"check_name":"Name of HTTP check",
"check_type":"HTTP",
"tags":[
"example_tag"
],
"check_params":{
"basic_auth":false,
"params":[
"size"
],
"encryption": {
"enabled": true,
"testNull": null,
}
}
};

const output = keyify(input);

console.log(output);

Edit1:对于您想要包含数组的一般情况。

const keyify = (obj, prefix = '') => 
Object.keys(obj).reduce((res, el) => {
if( typeof obj[el] === 'object' && obj[el] !== null ) {
return [...res, ...keyify(obj[el], prefix + el + '.')];
}
return [...res, prefix + el];
}, []);

const input = {
"check_id":12345,
"check_name":"Name of HTTP check",
"check_type":"HTTP",
"tags":[
"example_tag"
],
"nested": [
{ "foo": 0 },
{ "bar": 1 }
],
"check_params":{
"basic_auth":false,
"params":[
"size"
],
"encryption": {
"enabled": true,
"testNull": null,
}
}
};

const output = keyify(input);

console.log(output);

关于javascript - 如何从嵌套对象中获取所有具有值的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47062922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com