简体   繁体   English

如何使用键值对将嵌套的JSON数据结构展平为对象

[英]How to flatten a nested JSON data structure into an object with key value pairs

The strings that are coming from source is coming in fragmented JSON object in JSON object.I want to convert this JSON structure to flat JSON structure 来自源的字符串来自JSON对象中的碎片JSON对象。我想将此JSON结构转换为平面JSON结构

{
    "nest": {
        "a": {
            "b": {
                "h": {
                    "i": {
                        "all.css": "1",
                        "j": {
                            "k": {
                                "l": {
                                    "lr.png": "2",
                                    "c.png": "3"
                                },
                                ".png": "4"
                            }
                        }
                    }
                }
            }
        }
    }
}

I tried to do it but I could only get up to 1 key value pair, what i want is {"abhiall.css":"1","abhijkllr.png":"2","abhijklc.png":"3" ..and so on. 我尝试这样做,但是我最多只能得到1个键值对,我想要的是{"abhiall.css":"1","abhijkllr.png":"2","abhijklc.png":"3" ……等等。 Thanks 谢谢

You could use an iterative and recursive approach for nested objects. 您可以对嵌套对象使用迭代和递归方法。

 function flatten(object, target, path) { path = path || ''; Object.keys(object).forEach(function (key) { if (object[key] && typeof object[key] === 'object') { flatten(object[key], target, path + key); return; } target[path + key] = object[key]; }); } var data = { nest: { a: { b: { h: { i: { "all.css": "1", j: { k: { l: { "lr.png": "2", "c.png": "3" }, ".png": "4" } } } } } } } }, flat = {}; flatten(data.nest, flat); console.log(flat); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

You can user recursive function to return desired result. 您可以使用用户递归函数返回所需的结果。

 var obj = {"nest":{"a":{"b":{"h":{"i":{"all.css":"1","j":{"k":{"l":{"lr.png":"2","c.png":"3"},".png":"4"}}}}}}}} function flat(data, c) { var result = {} for(var i in data) { if(typeof data[i] == 'string') result[c + i] = data[i] if(typeof data[i] == 'object') result = Object.assign(result, flat(data[i], c+= i)) } return result } console.log(flat(obj.nest, '')) 

For array of objects I did the following Note : make sure the Objects Array passed in is n>0 at least 对于对象数组,我做了以下说明:确保传入的对象数组至少为n> 0

flatten(objects, target, path) {
let me = this;    
let retArray = [];
for(let x=0; x < objects.length; x++) {

  let object = objects[x];
  path = path || '';
  target={};

  target = me.flattenHelper(object, target, path);

  retArray.push(target);
}
return retArray;}

.. ..

flattenHelper(object, target, path){
let me = this;
Object.keys(object).forEach(function (key) {
  console.log("key : "+ key + " : object : " +  (object[key] && typeof object[key] === 'object') + " path : " + path);
  if (object[key] && typeof object[key] === 'object') {
      me.flattenHelper(object[key], target, path + key);
  }
  target[path + key] = object[key];
  console.log(target);
});
return target;}

Using this function: 使用此功能:

 const flattenObject = (obj, prefix = '') => Object.keys(obj).reduce((acc, k) => { const pre = prefix.length ? prefix : ''; if (typeof obj[k] === 'object') Object.assign(acc, flattenObject(obj[k], pre + k)); else acc[pre + k] = obj[k]; return acc; }, {}); console.log(flattenObject({"nest": {"a": {"b": {"h": {"i":{"all.css":"1","j": {"k": {"l": {"lr.png": "2","c.png": "3"},".png": "4"}}}}}}}})); 
 .as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;} 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM