Quiero secuenciar mi json pero quiero excluir matrices anidadas vacías de objetos.

Mi json se ve así:

{
  "Fe": {
    "Fh": {
        "a" : 1,
        "b" : "foo"
      },
      "Fb": {
          "Dbs": [
                  {
                    "Nl": "1",
                    "Dt": "red",
                  }
                 ],
          "Dr": [
                  {
                  }
               ]
        }
}

Quiero ignorar "Dr" porque está vacía.

¿Cómo puedo hacerlo en mecanografiado / Javascript?

Aquí está el código que he probado:

const str = JSON.stringify(this.json, replacer);

replacer(key, value) {
		if (value === null || value === {})
			return undefined;
		else
			return value;
	};

Gracias

-1
Karandip Singh 16 oct. 2018 a las 22:24

2 respuestas

La mejor respuesta

Puede utilizar un sustituto y comprobar si el valor es una matriz y si los elementos son objetos vacíos.

var object = { Fe: { Fh: { a: 1, b: "foo" }, Fb: { Dbs: [{ Nl: "1", Dt: "red" }], Dr: [{}] } } }, 
    json = JSON.stringify(
        object,
        (k, v) => Array.isArray(v) && v.every(o => JSON.stringify(o) === '{}')
            ? undefined
            : v
    );

console.log(json);
0
Nina Scholz 16 oct. 2018 a las 19:33

Me encontré con un problema similar, la respuesta aceptada me dio un excelente punto de partida, pero necesitaba algo un poco más robusto para trabajar con una estructura dinámica con claves profundamente anidadas.

Esto es lo que se me ocurrió, pensé que podría ser útil compartirlo con cualquier otra persona que se encuentre con esta pregunta:

function isEmpty(value) {
  if (value === null || value === undefined) {
    return true;
  }

  if (Array.isArray(value)) {
    return value.every(isEmpty);
  }
  else if (typeof (value) === 'object') {
    return Object.values(value).every(isEmpty);
  }

  return false;
}

function replacer(key, value) {
  return isEmpty(value)
    ? undefined
    : value;
}

function getPrettyJSON(obj: any) {
  return JSON.stringify(obj, replacer, 2);
}
0
jeremyalan 8 feb. 2020 a las 19:46