Las cadenas que provienen de la fuente provienen de un objeto JSON fragmentado en un objeto JSON. Quiero convertir esta estructura JSON en una estructura JSON plana

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

Traté de hacerlo, pero solo pude obtener hasta 1 par de valores clave, lo que quiero es {"abhiall.css":"1","abhijkllr.png":"2","abhijklc.png":"3" ... y así sucesivamente. Gracias

1
Kanak Srivastava 12 ene. 2017 a las 18:05

4 respuestas

La mejor respuesta

Podría usar un enfoque iterativo y recursivo para objetos anidados.

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; }
2
Nina Scholz 12 ene. 2017 a las 15:25

Usando esta función:

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;}
0
mojtaba ramezani 26 abr. 2019 a las 21:10

Puede utilizar la función recursiva para devolver el resultado deseado.

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, ''))
1
Nenad Vracar 12 ene. 2017 a las 15:20

Para la matriz de objetos, hice la siguiente Nota: asegúrese de que la matriz de objetos pasada sea n> 0 al menos

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;}
0
Tanzeel 30 mar. 2017 a las 09:52