将平展的键值对转换为嵌套对象>

Convert flattened key->value pairs to a nested object

本文关键字:对象 嵌套 转换 键值对      更新时间:2023-09-26

将以下键>值对象"array"转换为适当的"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,但它很快就以递归的方式变得复杂。

出于某种原因,我真的很想为此编写一个函数:

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) 的字符串。