您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

扁平化/非扁平化嵌套JSON对象的最快方法

扁平化/非扁平化嵌套JSON对象的最快方法

这是我的简短实现:

Object.unflatten = function(data) {
    "use strict";
    if (Object(data) !== data || Array.isArray(data))
        return data;
    var regex = /\.?([^.\[\]]+)|\[(\d+)\]/g,
        resultholder = {};
    for (var p in data) {
        var cur = resultholder,
            prop = "",
            m;
        while (m = regex.exec(p)) {
            cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));
            prop = m[2] || m[1];
        }
        cur[prop] = data[p];
    }
    return resultholder[""] || resultholder;
};

flatten并没有太大的改变(我不确定您是否真的需要这些isEmpty情况):

Object.flatten = function(data) {
    var result = {};
    function recurse (cur, prop) {
        if (Object(cur) !== cur) {
            result[prop] = cur;
        } else if (Array.isArray(cur)) {
             for(var i=0, l=cur.length; i<l; i++)
                 recurse(cur[i], prop + "[" + i + "]");
            if (l == 0)
                result[prop] = [];
        } else {
            var isEmpty = true;
            for (var p in cur) {
                isEmpty = false;
                recurse(cur[p], prop ? prop+"."+p : p);
            }
            if (isEmpty && prop)
                result[prop] = {};
        }
    }
    recurse(data, "");
    return result;
}

他们一起运行您的基准测试大约需要一半的时间(Opera12.16:?900ms而不是?1900ms,Chrome29:?800ms而不是?1600ms)。

这里回答的此解决方案和大多数其他解决方案都集中在速度上,并且容易受到原型污染的影响,因此不能在不受信任的对象上使用。

其他 2022/1/1 18:23:16 有277人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶