我有一个可以不规则的大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":[]
}
我希望它变成这样的东西:(我只需要具有浅键值的对象)
[
{
"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"}
}
]
我需要知道在没有ES6的情况下是否有一种简单的方法可以做到这一点。
答案 0 :(得分:1)
下一个提供的方法递归地遍历任何给定的数据结构的属性键列表,同时寻找与需要提供的另一个键的匹配。
如果匹配密钥,将通过另外提供的列表收集相关/引用(子)数据结构。
如果任何(子)数据结构是一个数组,它的每个数据项也将被递归处理。
如果任何(子)数据结构不是字符串类型,则该过程将开始一个新的递归,如本文开头所述。
$(a).find(...)

var data = {
"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": []
};
function collectListOfAllSubTypeDataRecursivelyByKey(collector, key) {
var
itemKey = collector.key,
data = collector.data,
list = collector.list;
if (Array.isArray(data)) {
data.forEach(function (dataItem) {
collector.list = list.concat(Object.keys(dataItem).reduce(collectListOfAllSubTypeDataRecursivelyByKey, {
key: itemKey,
data: dataItem,
list: []
}).list);
})
} else {
if (key === itemKey) {
list.push(data);
}
if (typeof (data = data[key]) !== 'string') {
collector.list = list.concat(Object.keys(data).reduce(collectListOfAllSubTypeDataRecursivelyByKey, {
key: itemKey,
data: data,
list: []
}).list);
}
}
return collector;
}
var subTypeList = Object.keys(data).reduce(collectListOfAllSubTypeDataRecursivelyByKey, {
key: 'type',
data: data,
list: []
}).list;
subTypeList.forEach(function (type) {
console.log('type : ', type);
});
// console.log('subTypeList : ', subTypeList);

对于处理后的数据结构,如OP所提供的,将有一个列表引用8项支持和子数据结构,每个结构都具有.as-console-wrapper { max-height: 100%!important; top: 0; }
属性的要求。从而反映了这8个项目的扁平列表。