Come si ritagliano gli spazi bianchi sia in chiavi che in valori in un oggetto JavaScript in modo ricorsivo?Ridurre gli spazi bianchi sia nella chiave dell'oggetto che nel valore in modo ricorsivo
Mi sono imbattuto in un problema in cui stavo cercando di "pulire" una stringa JSON fornita dall'utente e inviarla nel mio altro codice per un'ulteriore elaborazione.
Diciamo che abbiamo una stringa JSON fornita dall'utente la cui chiave e valore di proprietà sono di tipo "stringa". Tuttavia, ciò che è problematico in questo caso è che le chiavi e i valori non sono così puliti come desiderato. Dì un {"key_with_leading_n_trailing_spaces": "my_value_with_leading_spaces"}.
In questo caso, può facilmente causare problemi con il tuo programma JavaScript brillantemente scritto cercando di utilizzare tali dati (o dovremmo chiamarli dati sporchi?) Perché quando il codice sta cercando di ottenere il valore da questo JSON oggetto, non solo la chiave non corrisponde ma anche il valore non può essere abbinato. Ho cercato su google e ho trovato alcuni suggerimenti, ma non esiste una cura che curerà tutto.
Dato questo JSON con molti spazi bianchi in chiavi e valori.
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 "}
}
]
};
Quindi questo è ciò che mi si avvicinò con (con l'aiuto di usare 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 qui: ho fatto questo in 1, 2 passi perché non riuscivo a trovare un meglio uno scatto per affrontare tutta la soluzione. Se c'è un problema nel mio codice o qualcosa di meglio, si prega di condividere con noi.
Grazie!
tecnicamente non è JSON. – epascarello
Rimosso il tag json mentre si parla di un oggetto letterale javascript, non di JSON. –
Grazie, epascarello, non posso usare il termine con precisione ma questo è un oggetto JavaScript banale. Se non ti dispiace, fammi sapere dove non è qualificato come oggetto JSON. – vichsu