如何将javaScript对象中的所有空值替换为';空';一串
假设我有一个js对象:如何将javaScript对象中的所有空值替换为';空';一串,javascript,jquery,json,underscore.js,Javascript,Jquery,Json,Underscore.js,假设我有一个js对象: {"a": null, "b": 5, "c": 0, d: "", e: [1,2,null, 3]} 这就是我想要的: {"a": "null", "b": 5, "c": 0, d: "", e: [1,2,"null", 3]} 我唯一的想法就是使用: function nullToString(v) { return JSON.parse(JSON.stringify(v).split(":null").join(":\"null\"")); }
{"a": null, "b": 5, "c": 0, d: "", e: [1,2,null, 3]}
这就是我想要的:
{"a": "null", "b": 5, "c": 0, d: "", e: [1,2,"null", 3]}
我唯一的想法就是使用:
function nullToString(v) {
return JSON.parse(JSON.stringify(v).split(":null").join(":\"null\""));
}
但与我希望实现的目标相比,这似乎是一个相当昂贵的操作
如果jQuery或下划线.js中有任何有用的方法,那就太好了。这适用于您提供的数据:
var data = {"a": null, "b": 5, "c": 0, d: "", e: [1,2,null, 3]};
function nullToString(value) {
function recursiveFix(o) {
// loop through each property in the provided value
for(var k in o) {
// make sure the value owns the key
if (o.hasOwnProperty(k)) {
if (o[k]===null) {
// if the value is null, set it to 'null'
o[k] = 'null';
} else if (typeof(o[k]) !== 'string' && o[k].length > 0) {
// if there are sub-keys, make a recursive call
recursiveFix(o[k]);
}
}
}
}
var cloned = jQuery.extend(true, {}, value)
recursiveFix(cloned);
return cloned;
}
console.log(nullToString(data));
基本前提是递归地循环对象的属性,如果值为null,则替换该值
当然,你的问题的根源是“我想要更快的东西。”我邀请你描述一下你的解决方案,这一个,以及你遇到的任何其他解决方案。您的结果可能会令人惊讶。以下是一个非常简单的示例:
函数convertObjectValuesRecursive(对象、目标、替换){
obj={……obj};
Object.keys(obj.forEach)((key)=>{
if(obj[键]==目标){
obj[键]=替换;
}else if(object[key]='object'&&!Array.isArray(obj[key])){
obj[key]=convertObjectValuesRecursive(obj[key],目标,替换);
}
});
返回obj;
}
您始终可以通过迭代所有对象键(以及“子键”等)手动执行此操作。这可能是最快的解决方案。我希望有一些非强制性的解决方案……看看:[如何迭代json hashmap][1][1]:您已经展示了简短的解决方案。在这种情况下,您应该在快速工作和短代码之间进行选择。请尝试:JSON.parse(JSON.stringify(…).split(“null”),join(“null”)
。这种分割连接
方法在我的情况下比替换
产生了更好的结果。-当键是字符串时,递归问题太多了…@mnowotka我想这是另一个答案…而且函数不返回任何内容。它修改原始值。因此console.log(nullToString(value))
将始终返回未定义的值。但是nullToString(value);console.log(value);
将更新您的值。哦,我明白了。我需要一个函数返回一些内容,而不是修改对象,这样我就可以将其用作装饰器。很简单,只需克隆对象。请参阅我的更新。我正在使用jQuery.extend()对于克隆,<>代码>,但是如果你想要的话,你也可以使用。克隆确实使这明显慢了(与SrimTime/St/连接/解析解决方案相称)。如果你不介意原来的对象被修改,那么克隆就不再必要了,你可以通过简单的返回对象来恢复丢失的速度。