2012-06-27 2 views
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, однако он быстро усложнился рекурсивным образом.

+0

http://whathaveyoutried.com? – rcdmk

+0

Я начал возиться с вызовом функции, которая медленно проходила через ключи, предполагая, что самый последний «токен» - это значение, и обеспечение того, чтобы все токены были правильными значениями в объекте, а затем выполняли eval по всему ключу. Однако это быстро усложнилось. Теперь я рассматриваю возможность преобразования его в строковое представление объекта json и использования json.parse(). Мне жаль, что у меня нет кода для показа - я не ожидаю кода взамен; просто идеи. :-) – Meister

ответ

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).

+1

Вы джентльмен и ученый. Благодарю вас! – Meister

Смежные вопросы