Javascript 递归展平嵌套对象和数组中的对象

Javascript 递归展平嵌套对象和数组中的对象,javascript,json,recursion,flatten,Javascript,Json,Recursion,Flatten,我有一个很大的JSON对象,它可能是不规则的,我想要的是找到一种方法,将它的所有对象放在一个平面数组中 这是一个json示例: { "name":"getPost", "request":{ "type":"object", "fields":[{ "key":"id", "value":{"type":"string"} }] }, "response":{

我有一个很大的JSON对象,它可能是不规则的,我想要的是找到一种方法,将它的所有对象放在一个平面数组中

这是一个json示例:

{
    "name":"getPost",
    "request":{
        "type":"object",
        "fields":[{
            "key":"id",
            "value":{"type":"string"}
        }]
    },
    "response":{
        "type":"object",
        "fields":[{
            "key":"post",
            "value":{
                "type":"object",
                "fields":[{
                    "key":"id",
                    "value":{"type":"string"}
                },{
                    "key":"title",
                    "value":{"type":"string"}
                },{
                    "key":"content",
                    "value":{"type":"string"}
                },{
                    "key":"userId",
                    "value":{"type":"string"}
                }]
            }
        }]
    },
    "error":[]
}
我希望它变成这样:(我只需要具有浅键值的对象)


我需要知道在没有ES6的情况下是否有一种简单的方法可以做到这一点。

下一个提供的方法递归地遍历任何给定数据结构的属性键列表,同时查找与需要提供的另一个键的匹配

在匹配密钥的情况下,相关/参考(子)数据结构将通过额外提供的列表收集

如果任何(子)数据结构是一个数组,那么它的每个数据项也将被递归处理

如果任何(子)数据结构都不是字符串类型,则该过程将启动一个新的递归,如本文开头所述

var数据={
“名称”:“getPost”,
“请求”:{
“类型”:“对象”,
“字段”:[{
“密钥”:“id”,
“价值”:{
“类型”:“字符串”
}
}]
},
“答复”:{
“类型”:“对象”,
“字段”:[{
“密钥”:“post”,
“价值”:{
“类型”:“对象”,
“字段”:[{
“密钥”:“id”,
“价值”:{
“类型”:“字符串”
}
}, {
“键”:“标题”,
“价值”:{
“类型”:“字符串”
}
}, {
“密钥”:“内容”,
“价值”:{
“类型”:“字符串”
}
}, {
“密钥”:“用户ID”,
“价值”:{
“类型”:“字符串”
}
}]
}
}]
},
“错误”:[]
};
函数CollectListofAllSubjectDataRecursiveByKey(收集器,键){
变量
itemKey=collector.key,
data=collector.data,
list=collector.list;
if(Array.isArray(数据)){
data.forEach(函数(dataItem){
collector.list=list.concat(Object.keys(dataItem).reduce(collectListofAllSubjectDataRecursiveByKey{
key:itemKey,
数据:dataItem,
名单:[]
})(表),;
})
}否则{
如果(键===itemKey){
列表、推送(数据);
}
if(typeof(data=data[key])!=“string”){
collector.list=list.concat(Object.keys(data).reduce(collectListofAllSubjectDataRecursiveByKey{
key:itemKey,
数据:数据,
名单:[]
})(表),;
}
}
回程收集器;
}
var SUBTIPLIST=Object.keys(data).reduce(CollectListofAllSubjectDataRecursiveByKey{
键:'类型',
数据:数据,
名单:[]
}).名单;
子列表.forEach(函数(类型){
console.log('type:',type);
});
//log('subsublist:',subsublist)

.as控制台包装{max height:100%!important;top:0;}
这是一个非常具体的问题。它不仅仅是将数组展平,它还将数据规范化为只有您知道它何时正确的形式。因此,问题是:定义目标结构的规则是什么?。。。如果一个人坚持OP的请求-我只需要具有浅键值的对象-他最终会得到一个
{“type”:“string”}
列表,因为这是唯一的浅子结构<代码>{“key”:“userId”,“value”:{“type”:“string”}}
已经太复杂了。或者浅键值是什么意思?我的意思是所有有类型的对象,我的问题是我想验证类型,它们可以是基本类型,比如字符串、数字、数组或对象,它们也可以是用户定义的类型,所以我需要找到它们,然后验证它们@在提供的数据结构的第一级,PeterSeliger
request
response
也具有
type
,但不是预期结果示例数据的一部分。是的,这就是问题所在,正如我在问题中所说,JSON可能是不规则的。包含对象和数组,我需要验证具有“type”字段的对象
[
    {
        "key":"id",
        "value":{"type":"string"}
    },{
        "key":"post",
        "value":{"type":"object"}
    },{
        "key":"id",
        "value":{"type":"string"}
    },{
        "key":"title",
        "value":{"type":"string"}
    },{
        "key":"content",
        "value":{"type":"string"}
    },{
        "key":"userId",
        "value":{"type":"string"}
    }
]