假设我有这个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\""));
}
但与我想要实现的目标相比,这似乎是一项相当昂贵的操作。
如果jQuery或underscore.js中有任何有用的方法,那就太棒了。
答案 0 :(得分:3)
这适用于您提供的数据:
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时替换该值。
当然,问题的根源是“我想要更快的东西”。我邀请您分析您的解决方案,此解决方案以及您遇到的任何其他解决方案。您的结果可能会令人惊讶。
答案 1 :(得分:0)
这是一个非常简单的例子:
function convertObjectValuesRecursive(obj, target, replacement) {
obj = {...obj};
Object.keys(obj).forEach((key) => {
if (obj[key] == target) {
obj[key] = replacement;
} else if (typeof obj[key] == 'object' && !Array.isArray(obj[key])) {
obj[key] = convertObjectValuesRecursive(obj[key], target, replacement);
}
});
return obj;
}
该函数接受三个参数:obj,目标值和替换值,并将使用替换值递归替换所有目标值(包括嵌套对象中的值)。