Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 转换展平键->;与嵌套对象的值对_Javascript_Parsing_Eval - Fatal编程技术网

Javascript 转换展平键->;与嵌套对象的值对

Javascript 转换展平键->;与嵌套对象的值对,javascript,parsing,eval,Javascript,Parsing,Eval,将下面的key->value对象“array”转换为正确的“JSON”样式对象的最简单方法是什么?下面的示例是将输入转换为图形 var input = { "graph.default.seriesColor" : ["#cccccc", "#3c3c3c"], "graph.default.stackSeries" : false, "graph.default.title.text" : "Hello!", "graph.default.title.show"

将下面的key->value对象“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);
函数makeObj(输入)
{
var输出={};
for(输入中的var键)
{
var nodes=key.split('.'),dest=output;
如果(节点长度<1)
继续;
对于(变量i=0;i<(nodes.length-1);+i)
{
var节点=节点[i];
dest=(dest[节点]==未定义)?
(dest[node]={}):dest[node];
}
dest[nodes[nodes.length-1]=输入[key];
}
返回输出;
}
图形=makeObj(输入);

显然,与
eval
解决方案不同,它只接受与您描述的格式完全相同的字符串(x.y.z)。

我开始胡乱调用一个函数,该函数将慢慢遍历键,假设最后一个“标记”是一个值,并确保之前的所有标记都是对象中的有效值,然后对整个密钥运行eval。然而,它很快变得复杂起来。我现在正在考虑将其转换为json对象的字符串表示形式,并使用json.parse()。很抱歉,我没有任何代码可以显示——我不希望代码得到回报;只是想法。:-)