Quiero crear una función que verifique un JSON anidado para elementos específicos y, si se encuentra, eliminará todas las instancias del elemento, incluso si se encuentra en una matriz.

Por ejemplo, digamos que tengo una JSON:

{
    "userId": "John991",
    "group1": {
        "color": "red",
        "height": "100",
        "userid": "John992"
    },
    "data": [
        {
            "userid": "John993",
            "Key3": "Value3"
        },
        {
            "group2": [{
                "userid": "John994"
            }]
        }
    ],
    "Key1": "Value1",
    "Key2": "Value2"
}

Quiero que mi resultado sea

{
    "group1": {
        "color": "red",
        "height": "100"
    },
    "data": [
        {
            "Key3": "Value3"
        },
        {
            "group2": [
                {}
            ]
        }
    ],
    "Key1": "Value1",
    "Key2": "Value2"
}

Lo mejor que he podido hacer es analizar el JSON y eliminar el elemento si existe. Sin embargo, esto no tiene en cuenta las matrices o los JSON anidados. El siguiente código solo elimina "userid": "John991".

 var b1 = JSON.parse(JSON);

 if (b1.hasOwnProperty("userid")){
    delete b1["userid"];
 }
0
vinhpham95 6 feb. 2020 a las 22:25

2 respuestas

La mejor respuesta

Puede crear una función que recorra las teclas y elimine la clave de forma recurrente. Algo como esto

const input = {
  "userId": "John991",
  "group1": {
      "color": "red",
      "height": "100",
      "userid": "John992"
  },
  "data": [
      {
          "userid": "John993",
          "Key3": "Value3"
      },
      {
          "group2": [{
              "userid": "John994"
          }]
      }
  ],
  "Key1": "Value1",
  "Key2": "Value2"
};


function deleteKey(obj, keyToDelete) {
  Object.keys(obj).forEach(key => {
    if (key.toLowerCase() === keyToDelete) {
      delete obj[key];
    }
    value = obj[key];
    if (value instanceof Object) {
      deleteKey(value, keyToDelete);
    }
  });
}
deleteKey(input, "userid");

console.log(JSON.stringify(input, null, 2));
1
Ashish Modi 6 feb. 2020 a las 20:00

Esta función hace lo que quieres:

const json = {
  "userId": "John991",
  "group1": {
    "color": "red",
    "userid": "John992",
    "height": "100"
  },
  "data": [{
      "userid": "John993",
      "Key3": "Value3"
    },
    {
      "group2": [{
        "userid": "John994"
      }]
    }
  ],
  "Key1": "Value1",
  "Key2": "Value2"
}

function objWithout(obj, property) {
  let json = JSON.stringify(obj);
  const regex = new RegExp(`,?"${property}":".*?",?`, "gi");
  json = json.replace(regex, '');
  json = json.replace(/""/, '","');
  return JSON.parse(json);
}

const result = objWithout(json, "userId")
console.log(result)

La función objWithout encadena el objeto proporcionado, reemplaza el texto y devuelve un objeto analizado a partir del texto editado. El reemplazo de texto busca todas las instancias de property independientemente de dónde aparezca en el objeto, por lo que si userId aparece en un objeto que es miembro del objeto proporcionado, todavía se reemplaza.

Regex reemplaza todas las instancias de la propiedad y su valor junto con cualquier , inicial y final. En un segundo paso, , se agrega nuevamente para los casos en que la propiedad está en el medio de otras dos propiedades, p. {"a":"b","userId":"user123","c":"d"}.

El reemplazo de texto se realiza mediante una expresión regular. Puede leer más sobre ellos aquí https://regexr.com/.

Además, agregué el indicador / i /, porque su objeto tiene "userId" y "userid", pero creo que quiere que ambos desaparezcan.

2
steven.westside 6 feb. 2020 a las 23:02