在嵌套对象和数组javascript中递归地展平对象

时间:2017-11-08 09:57:09

标签: javascript json recursion flatten

我有一个可以不规则的大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的情况下是否有一种简单的方法可以做到这一点。

1 个答案:

答案 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个项目的扁平列表。