Recorte espacios en blanco en clave de objeto y valor de forma recursiva
¿Cómo se recortan los espacios en blanco tanto en las claves como en los valores de un objeto JavaScript recursivamente?
Encontré un problema en el que estaba tratando de "limpiar" una cadena JSON suministrada por el usuario y enviarla a mi otro código para su posterior procesamiento.
Digamos que tenemos una cadena JSON proporcionada por el usuario cuya clave y valor de propiedad son del tipo "cadena". Sin embargo, lo problemático en este caso es que las claves y los valores no son tan limpios como se desea. Diga un {"key_with_leading_n_trailing_spaces": "my_value_with_leading_spaces"}.
En este caso, puede causar problemas fácilmente con su programa JavaScript escrito brillantemente tratando de hacer uso de dichos datos (¿o deberíamos llamarlo datos sucios?) Porque cuando su código está tratando de obtener el valor de este objeto JSON, no solo la clave no coincide pero tampoco el valor puede coincidir. He buscado en Google y he encontrado algunos consejos, pero no hay una cura que lo cure todo.
Dado este JSON con muchos espacios en blanco en claves y valores.
var badJson = {
" some-key ": " let it go ",
" mypuppy ": " donrio ",
" age ": " 12.3",
" children ": [
{
" color": " yellow",
"name ": " alice"
}, {
" color": " silver ",
"name ": " bruce"
}, {
" color": " brown ",
" name ": " francis"
}, {
" color": " red",
" name ": " york"
},
],
" house": [
{
" name": " mylovelyhouse ",
" address " : { "number" : 2343, "road " : " boardway", "city " : " Lexiton "}
}
]
};
Entonces esto es lo que se me ocurrió (con la ayuda de usar lodash.js):
//I made this function to "recursively" hunt down keys that may
//contain leading and trailing white spaces
function trimKeys(targetObj) {
_.forEach(targetObj, function(value, key) {
if(_.isString(key)){
var newKey = key.trim();
if (newKey !== key) {
targetObj[newKey] = value;
delete targetObj[key];
}
if(_.isArray(targetObj[newKey]) || _.isObject(targetObj[newKey])){
trimKeys(targetObj[newKey]);
}
}else{
if(_.isArray(targetObj[key]) || _.isObject(targetObj[key])){
trimKeys(targetObj[key]);
}
}
});
}
//I stringify this is just to show it in a bad state
var badJson = JSON.stringify(badJson);
console.log(badJson);
//now it is partially fixed with value of string type trimed
badJson = JSON.parse(badJson,function(key,value){
if(typeof value === 'string'){
return value.trim();
}
return value;
});
trimKeys(badJson);
console.log(JSON.stringify(badJson));
Nota aquí: hice esto en 1, 2 pasos porque no pude encontrar una mejor solución para tratarlo todo. Si hay algún problema en mi código o algo mejor, compártelo con nosotros.
¡Gracias!