Ell*_* B. 7 javascript performance internet-explorer
我正在开发一个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;
};
Run Code Online (Sandbox Code Playgroud)
我在这里进行一些基准测试:http://jsfiddle.net/emw89/7/
上面的测试时钟在我的机器上大约570毫秒.
我能做些什么来改善这个功能的性能吗?
编辑:我关闭了我的IE,重新打开IE并再次运行了jsfiddle基准测试 - 它现在为我提供了~180ms.我的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;
}
};
Run Code Online (Sandbox Code Playgroud)
快100%.