如何以递归方式修剪JavaScript对象中的键和值中的空格?以递归方式修剪对象键和值中的空白
我遇到了一个问题,我试图“清理”用户提供的JSON字符串并将其发送到我的其他代码中以供进一步处理。
比方说,我们有一个用户提供的JSON字符串,其属性键和值的类型为“string”。然而,在这种情况下有什么问题是键和值不够干净。说一个{“key_with_leading_n_trailing_spaces”:“my_value_with_leading_spaces”}。
在这种情况下,它可能很容易导致您的精彩编写的JavaScript程序试图利用这些数据(或者我们应该把它称为脏数据?)的问题,因为当你的代码试图从这个JSON中获取值对象,不仅关键不匹配,而且值也不能匹配。我环顾了谷歌,发现了一些技巧,但没有一种治疗方法可以治愈这一切。
鉴于这个JSON有很多键和值的空白。
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 "}
}
]
};
原来这就是我想出了(使用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));
注意这里:我这样做是在1,2个步骤,因为我无法找到一个更好地解决一切问题。如果我的代码存在问题或其他问题,请与我们分享。
谢谢!
技术上它不是JSON。 – epascarello
由于您正在讨论JavaScript对象字面值而不是JSON,因此删除了json标记。 –
谢谢,epascarello,我可能不会使用这个术语,但这是一个简单的JavaScript对象。如果您不介意,请让我知道它不适合作为JSON对象。 – vichsu