Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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 返回嵌套JSON中包含特定键的所有值?_Javascript_Json - Fatal编程技术网

Javascript 返回嵌套JSON中包含特定键的所有值?

Javascript 返回嵌套JSON中包含特定键的所有值?,javascript,json,Javascript,Json,我已将JSON嵌套如下: { "fields": { "type": "custom", "level1": { "type": "custom" }, "level2": { "type": "custom", "level3": { "type": "custom" },

我已将JSON嵌套如下:

{
    "fields": {
        "type": "custom",
        "level1": {
            "type": "custom"
        },
        "level2": {
            "type": "custom",
            "level3": {
                "type": "custom"
            },
            "level31": {
                "type": "notcustom"
            }
        }
    }
}
我想提取所有具有键
type

我想要的输出是:

{
    "fields":"custom",
    "level1":"custom",
    "level2":"custom"
}
您需要一个向导来导航树结构

下面的代码片段执行此操作,并将结果添加到自定义字段数组中

我没有删除自定义字段的子属性,因此如果自定义字段具有子级别属性,则该属性也将包含在内。您可以删除这些子属性,但也可以修改源对象树。因此,这可以通过使用
Object.create
创建克隆并随后删除整个属性来解决。。。但我相信,完整的代码足以让你敞开心扉,理解你将如何解决这个问题

运行代码段以实时查看JSON结果

更新 虽然您请求了一个对象作为结果(毕竟有点像字典),但我建议数组结果在这种情况下应该工作得更好,因为如果有多个“level”属性以相同的方式调用(例如,两个
level1
属性),结果中只能访问最后一个,因为它可能被覆盖

var obj={
“字段”:{
“类型”:“自定义”,
“一级”:{
“类型”:“自定义”
},
“二级”:{
“类型”:“自定义”,
“三级”:{
“类型”:“自定义”
},
“第31级”:{
“类型”:“非自定义”
}
}
}
};
函数getCustomFields(字段,customFields){
var customFields=typeof customFields!=“未定义”?customFields:[];
如果(字段[“类型”]=“自定义”){
customFields.push(字段);
}
//Object.keys以数组形式获取所有自己的对象属性名称
//为了使用筛选器执行字段名以开头的“where”
//“level”字。过滤每个“level”属性后,执行
//一个Array.forEach,用于对
//提供每个级别字段和当前customFields数组的内部级别
//为了积累结果。。。
Object.keys(字段).filter(函数)(字段名){
返回fieldName.indexOf(“级别”)==0;
}).forEach(函数(levelPropertyName){
getCustomFields(字段[levelPropertyName],customFields);
});
返回自定义字段;
}
var customFields=getCustomFields(对象字段);
document.getElementById(“结果”).textContent=JSON.stringify(自定义字段)

我尝试使用递归方法简化。首先检查它是否是一个对象。如果它再次是一个对象,则调用传递该对象的函数

否则,请检查是否存在键和适当的值。在结果对象中填充它并返回它

var对象={
“字段”:{
“类型”:“自定义”,
“一级”:{
“类型”:“自定义”
},
“二级”:{
“类型”:“自定义”,
“三级”:{
“类型”:“自定义”
},
“第31级”:{
“类型”:“非自定义”
}
}
}
};
函数递归迭代器(对象、指针、值、结果){
var result=result |{};
for(对象中的变量键){
if(对象[键][针]==值){
结果[键]=对象[键][针];
}
if(对象类型[键]=“对象”){
递归迭代器(对象[键]、指针、值、结果);
}
}
返回结果;
}
document.getElementById(“结果”).textContent=JSON.stringify(递归迭代器(对象,“类型”,“自定义”))

mm..检查一下:如果“fields”对象包含嵌套的fields obj,而该对象又包含嵌套的“fields”对象,并且其中一些对象在其级别上包含属性
类型
?你不知道什么是什么…你需要使用堆栈。这是一个问题。使用递归函数可以解决这个问题,但是没有一个函数可以解析json来找到它。这对我的问题很有效,但我想知道是否有直接的方法。我有一个非常巨大的json,在一个多维json中包含大约400个字段。如果我使用递归方法,它不会消耗更多的时间并降低性能吗?