tre*_*ler 3 javascript arrays recursion object javascript-objects
我正在寻找类似的东西,Object.keys但适用于潜在的嵌套对象.它也不应该包含具有对象/数组值的键(它应该只包含具有直接字符串/数字/布尔值的键).
{
"check_id":12345,
"check_name":"Name of HTTP check",
"check_type":"HTTP"
}
Run Code Online (Sandbox Code Playgroud)
[
"check_id",
"check_name",
"check_type"
]
Run Code Online (Sandbox Code Playgroud)
Object.keys 适用于像这样的扁平案例,但不适用于嵌套案例:
{
"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,
}
}
}
Run Code Online (Sandbox Code Playgroud)
[
"check_id",
"check_name",
"check_type",
"check_params.basic_auth",
"check_params.encryption.enabled"
]
Run Code Online (Sandbox Code Playgroud)
请注意,这并不包括tags,check_params,check_params.params,或者check_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 + '.')];
} else {
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);Run Code Online (Sandbox Code Playgroud)
生成器可以快速解决此类问题 -
function* deepKeys (t, pre = [])
{ if (Array.isArray(t))
return
else if (Object(t) === t)
for (const [k, v] of Object.entries(t))
yield* deepKeys(v, [...pre, k])
else
yield pre.join(".")
}
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,}}}
console.log(Array.from(deepKeys(input)))Run Code Online (Sandbox Code Playgroud)
[ "check_id"
, "check_name"
, "check_type"
, "check_params.basic_auth"
, "check_params.encryption.enabled"
, "check_params.encryption.testNull"
]
Run Code Online (Sandbox Code Playgroud)
或者是一个急切计算所有键的纯函数表达式 -
const deepKeys = (t, pre = []) =>
Array.isArray(t)
? []
: Object(t) === t
? Object
.entries(t)
.flatMap(([k, v]) => deepKeys(v, [...pre, k]))
: pre.join(".")
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,}}}
console.log(deepKeys(input))Run Code Online (Sandbox Code Playgroud)
[ "check_id"
, "check_name"
, "check_type"
, "check_params.basic_auth"
, "check_params.encryption.enabled"
, "check_params.encryption.testNull"
]
Run Code Online (Sandbox Code Playgroud)