【发布时间】:2015-11-03 22:52:36
【问题描述】:
如何递归地修剪 JavaScript 对象中键和值中的空格?
我遇到了一个问题,我试图“清理”用户提供的 JSON 字符串并将其发送到我的其他代码中以进行进一步处理。
假设我们有一个用户提供的 JSON 字符串,其属性键和值都是“字符串”类型。但是,在这种情况下,问题在于键和值不像期望的那样干净。说一个 { " key_with_leading_n_trailing_spaces ": " my_value_with_leading_spaces" }。
在这种情况下,它很容易导致您编写出色的 JavaScript 程序尝试使用此类数据(或者我们应该称之为脏数据吗?),因为当您的代码试图从这个 JSON 对象中获取值时,不仅key不匹配,value也不匹配。我浏览了谷歌并找到了一些提示,但没有一种方法可以治愈这一切。
鉴于此 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。
-
删除了 json 标记,因为您谈论的是 javascript 对象文字,而不是 JSON。
-
谢谢,epascarello,我可能没有准确地使用这个词,但这是一个微不足道的 JavaScript 对象。如果您不介意,请告诉我它在哪里不符合 JSON 对象的条件。
-
现在我看到了区别,我应该说它是一个 javscript 对象文字。谢谢,迈克!我尝试了 RobG 的建议,但我得到 obj.reduce 不是函数。你指的是node js npm包中的object.reduce吗?
-
@vichsu—哎呀,reduce 是一种数组方法,我的意思是遍历
Object.keys(obj).reduce(...),但是该函数也需要递归。目前没有足够的时间来回答。
标签: javascript object recursion trim