将扁平化的键值对转换为嵌套对象

3
什么是将下面的键值对“数组”转换为正确的“JSON”样式对象的最简单方法?以下示例将输入转换为图形。
var input = {
    "graph.default.seriesColor" : ["#cccccc", "#3c3c3c"],
    "graph.default.stackSeries" : false,
    "graph.default.title.text" : "Hello!",
    "graph.default.title.show" : false,
    "graph.default.axesDefaults.show" : true,
    "graph.default.axesDefaults.min" : 17,
    "graph.default.axesDefaults.max" : 20,
};

var graph = {
    default: {
        seriesColor: ["#cccccc", "#3c3c3c"],
        stackSeries: false,

        title: {
            text: "Hello!",
            show: false
        },

        axesDefault: {
            show: true,
            min: 17,
            max: 20
        }
    }
};

我考虑使用eval,但很快就变得递归起来很复杂。

我开始尝试调用一个函数,它将通过键逐渐进行,假设最后一个“令牌”是一个值,并确保之前的所有令牌都是对象中有效的值,然后对整个键运行eval。但是,这很快变得复杂起来。我现在考虑将其转换为JSON对象的字符串表示,并使用json.parse()。很抱歉我没有任何代码可展示--我不需要返回代码;只是想法。 :-) - Meister
1个回答

4

出于某些原因,我真的想为您编写此功能:

function makeObj(input)
{
    var output = {};

    for(var key in input)
    {
        var nodes = key.split('.'), dest = output;

        if(nodes.length < 1)
            continue;

        for(var i = 0; i < (nodes.length - 1); ++ i)
        {
            var node = nodes[i];

            dest = (dest[node] === undefined) ?
                        (dest[node] = {}) : dest[node];
        }

        dest[nodes[nodes.length - 1]] = input[key];
    }

    return output;
}

graph = makeObj(input);

显然,与使用“eval”解决方案不同,此方法仅接受格式完全符合您描述的字符串(x.y.z)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接