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"];
}
2 respuestas
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));
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.
Preguntas relacionadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.