Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从嵌套对象获取具有值的所有键_Javascript_Arrays_Object_Recursion_Javascript Objects - Fatal编程技术网

Javascript 如何从嵌套对象获取具有值的所有键

Javascript 如何从嵌套对象获取具有值的所有键,javascript,arrays,object,recursion,javascript-objects,Javascript,Arrays,Object,Recursion,Javascript Objects,我正在寻找类似于Object.keys的东西,但它适用于潜在的嵌套对象。它也不应该包括具有对象/数组值的键(它应该只包括具有立即字符串/数字/布尔值的键) 例A 输入 预期产量 [ “检查您的id”, “检查您的姓名”, “检查类型” ] Object.keys适用于类似这样的平面案例,但不适用于嵌套案例: 例B 输入 { “支票id”:12345, “检查名称”:“HTTP检查名称”, “检查类型”:“HTTP”, “标签”:[ “示例_标记” ], “检查参数”:{ “基本授权”:错误,

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

例A 输入 预期产量
[
“检查您的id”,
“检查您的姓名”,
“检查类型”
]
Object.keys
适用于类似这样的平面案例,但不适用于嵌套案例:

例B 输入
{
“支票id”:12345,
“检查名称”:“HTTP检查名称”,
“检查类型”:“HTTP”,
“标签”:[
“示例_标记”
],
“检查参数”:{
“基本授权”:错误,
“参数”:[
“尺寸”
],
“加密”:{
“启用”:正确,
}
}
}
预期产量
[
“检查您的id”,
“检查您的姓名”,
“检查类型”,
“检查参数基本验证”,
“检查参数加密。已启用”
]
请注意,这不包括
标记
检查参数
检查参数
、或
检查参数加密
,因为这些值是数组/对象

问题
有这样的图书馆吗?您将如何实现它,以便它可以处理任何对象,无论是大对象、嵌套对象还是小对象?

您可以像这样使用reduce:

constkeyify=(对象,前缀=“”)=>
Object.keys(obj).reduce((res,el)=>{
if(Array.isArray(obj[el])){
返回res;
}else if(对象的类型=='object'&&obj[el]!==null){
返回[…res,…keyify(obj[el],前缀+el+')];
}
返回[…res,前缀+el];
}, []);
常量输入={
“支票id”:12345,
“检查名称”:“HTTP检查名称”,
“检查类型”:“HTTP”,
“标签”:[
“示例_标记”
],
“检查参数”:{
“基本授权”:错误,
“参数”:[
“尺寸”
],
“加密”:{
“启用”:正确,
“testNull”:null,
}
}
};
常量输出=键控(输入);
控制台日志(输出)这就是你的意思吗


我不能用vanilla JS来实现这一点,这是一个依赖lodash的相当粗糙的解决方案。基本上利用lodashs
.forIn
.isArray
函数对对象进行迭代。此外,这将只深入1层,因此嵌套对象中的对象将被忽略。不过,它确实产生了您预期的输出,所以我认为这是一个不错的起点。

您可以在
中为…使用
,并创建递归函数

var obj={“check_id”:12345,“check_name”:“HTTP检查的名称”,“check_类型”:“HTTP”,“tags”:[“example_tag”],“check_params”:{“basic_auth”:false,“params”:[“size”,{“a”:“b”}],“encryption”:{“enabled”:true}}
变量键=[]
函数getKeys(数据,k=''){
用于(数据中的var i){
var rest=k.长度?'.+i:i
if(数据类型[i]=“对象”){
if(!Array.isArray(数据[i])){
getkey(数据[i],k+rest)
}
}else键。按下(k+rest)
}
}
获取密钥(obj)

log(keys)
您可以检查键并进行迭代,否则将路径推送到结果集

函数getKeys(对象){
功能iter(o,p){
if(Array.isArray(o)){return;}
if(o&&typeof o==='object'){
var keys=Object.keys(o);
if(键长度){
keys.forEach(函数(k){iter(o[k],p.concat(k));});
}
返回;
}
结果:推(p.join('.');
}
var结果=[];
国际热核实验堆(对象,[]);
返回结果;
}
var object={check_id:12345,check_name:“HTTP检查的名称”,check_type:“HTTP”,标记:[“example_tag”],check_参数:{basic_auth:false,参数:[“size”],加密:{enabled:true}};
log(getKeys(object))

.as控制台包装{max height:100%!important;top:0;}
生成器可以快速解决此类问题-

函数*deepKeys(t,pre=[])
{if(Array.isArray(t))
返回
else if(对象(t)==t)
for(对象项(t)的常数[k,v]
收益率*deepkey(v,[…pre,k])
其他的
收益率预联接(“.”)
}
常量输入=
{check_id:12345,check_name:“HTTP检查的名称”,check_type:“HTTP”,标记:[“example_tag”],check_参数:{basic_auth:false,参数:[“size”],加密:{enabled:true,testNull:null,}}

console.log(Array.from(deepKeys(input))
请添加您尝试过的和不起作用的键。它也不应该包括具有对象/数组值的键-但在您的示例B中,
check_params
被添加到列表中,即使它的值是一个对象。@tymeJV
预期输出
仅包含
检查参数.basic\u auth
检查参数.encryption.enabled
(嵌套密钥),不是具有对象值的
check_params
本身。具有全局
keys
变量等明显不必要的副作用可能会向新的JS程序员传达错误的信息。不过我只是想一想。@NinaScholz您的意思是如果
输入
对象是
空的
?也许您将
启用
的值从
真的
更改为
空的
,那么它就不起作用了,因为您缺少一个检查。当我们要返回所有键时,我有一个类似的问题,请添加这个对象{a:1,b:2,c:[“a”,“b”,“c”],z:{a:“j”,q:“q”}它将返回[“a”,“b”,“z.a”,“z.q”],如何显示所有像c这样的键?@Yasingermani查看我答案的结尾。“Edit1:对于希望包含数组的一般情况。”
{
   "check_id":12345,
   "check_name":"Name of HTTP check",
   "check_type":"HTTP"
}