Javascript 递归展平嵌套对象和数组中的对象
我有一个很大的JSON对象,它可能是不规则的,我想要的是找到一种方法,将它的所有对象放在一个平面数组中 这是一个json示例:Javascript 递归展平嵌套对象和数组中的对象,javascript,json,recursion,flatten,Javascript,Json,Recursion,Flatten,我有一个很大的JSON对象,它可能是不规则的,我想要的是找到一种方法,将它的所有对象放在一个平面数组中 这是一个json示例: { "name":"getPost", "request":{ "type":"object", "fields":[{ "key":"id", "value":{"type":"string"} }] }, "response":{
{
"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”}}
已经太复杂了。或者浅键值是什么意思?我的意思是所有有类型的对象,我的问题是我想验证类型,它们可以是基本类型,比如字符串、数字、数组或对象,它们也可以是用户定义的类型,所以我需要找到它们,然后验证它们@在提供的数据结构的第一级,PeterSeligerrequest
和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"}
}
]