javascript - 优化将 JSON 属性名称小写的 JavaScript 代码

标签 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;
};

我在这里执行一些基准测试: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%。

关于javascript - 优化将 JSON 属性名称小写的 JavaScript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9421556/

相关文章:

javascript - 如何在 DIV 标签上使用 javascript onclick 来切换包含可点击链接的部分的可见性?

javascript - 理解 javascript void

javascript - 用于匹配两个其他字符串之间的字符串的正则表达式

css - IE 设置 :focus on lots of random elements

javascript - 使元素在 IE 中可见?

html - CSS 在 IE 11 中不起作用

javascript - 在将socket.io错误发送到控制台之前,我可以捕获它吗?

android - 如果 USAGE_SHARED,Renderscript 在启用 GPU 的驱动程序上失败

multithreading - OpenMP:基于 NUMA 的拆分循环

c# - 在 .NET 中可以将数组或列表作为属性返回吗?