我正在开发一个 Web 应用程序,该应用程序接收具有大写属性名称的 JSON 数据。我需要这些属性名称为小写,因此我使用一个函数递归地循环遍历 JSON 对象并将它们转换为小写。
问题是我的 JSON 回复可能会变得非常大。我希望该函数能够表现良好,即使它必须处理具有 60,000 个属性名称和各种嵌套级别的 JSON。
小写函数是:
FN = function (obj)
{var ret = null;
if (typeof(obj) == "string" || typeof(obj) == "number")
return obj;
else if (obj.push)
ret = [];
else
ret = {};
for (var key in obj)
ret[String(key).toLowerCase()] = FN(obj[key]);
return ret;
};
我在这里进行一些基准测试:http://jsfiddle.net/emw89/7/ http://jsfiddle.net/emw89/7/
上述测试在我的机器上的运行时间约为 570 毫秒。
我可以做些什么来提高这个功能的性能吗?
编辑:我关闭了 IE,重新打开 IE 并再次运行 jsfiddle 基准测试 - 现在对我来说大约为 180 毫秒。直到那时我的 IE 已经打开了几天,所以也许这就是导致性能如此糟糕的原因。不管怎样,我仍然感兴趣是否有办法进一步优化这个功能。处理 JSON 所花费的任何额外时间都会直接增加每个 AJAX 请求的消耗时间。
var lowerCache = {};
FN = function (obj)
{
if (typeof(obj) === "string" || typeof(obj) === "number")
return obj;
var l = obj.length;
if (l) {
l |= 0;
var result = [];
result.length = l;
for (var i = 0; i < l; i++) {
var newVal = obj[i];
result[i] = typeof(newVal) === "string" ? newVal : FN(newVal);
}
return result;
} else {
var ret = {};
for (var key in obj) {
var keyStr = typeof(key) === "string" ? key : String(key);
var newKey = lowerCache[keyStr];
if (newKey === undefined) {
newKey = keyStr.toLowerCase();
lowerCache[keyStr] = newKey;
}
var newVal = obj[key];
ret[newKey] = typeof(newVal) === "string" ? newVal : FN(newVal);
}
return ret;
}
};
快 100%。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)