Leerräume sowohl im Objektschlüssel als auch im Wert rekursiv entfernen
Wie schneidet man rekursiv Leerzeichen sowohl in den Schlüsseln als auch in den Werten eines JavaScript-Objekts?
Ich bin auf ein Problem gestoßen, bei dem ich versucht habe, eine vom Benutzer bereitgestellte JSON-Zeichenfolge zu "bereinigen" und zur weiteren Verarbeitung in meinen anderen Code zu senden.
Nehmen wir an, wir haben einen benutzerdefinierten JSON-String, dessen Eigenschaftsschlüssel und Wert vom Typ "string" sind. In diesem Fall ist jedoch problematisch, dass die Schlüssel und Werte nicht so sauber sind, wie gewünscht. Sagen Sie {"key_with_leading_n_trailing_spaces": "my_value_with_leading_spaces"}.
In diesem Fall kann es leicht zu Problemen mit Ihrem hervorragend geschriebenen JavaScript-Programm kommen, das versucht, solche Daten zu verwenden (oder sollten wir es schmutzige Daten nennen?), Da Ihr Code versucht, den Wert aus diesem JSON-Objekt herauszuholen, nicht Nur der Schlüssel stimmt nicht überein, aber auch der Wert kann nicht übereinstimmen. Ich habe mich bei Google umgesehen und ein paar Tipps gefunden, aber es gibt kein einziges Heilmittel, das alles heilt.
Gab diese JSON mit vielen Leerzeichen in Schlüsseln und Werten.
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 "}
}
]
};
Da habe ich mir das ausgedacht (mithilfe von 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));
Hinweis hier: Ich habe das in 1, 2 Schritten gemacht, weil ich keinen besseren Schuss finden konnte, um alles zu lösen. Wenn es ein Problem in meinem Code oder etwas anderem gibt, teilen Sie es uns bitte mit.
Vielen Dank