Преобразование строки в ассоциативный массив javascript - PullRequest
1 голос
/ 09 февраля 2012

У меня есть строка

string = "masterkey[key1][key2]";

Я хочу создать ассоциативный массив из этого, чтобы он оценивался в:

{
  masterkey: {
    key1: {
      key2: value
    }
  }
}

Я пробовал это:

var fullName = string;
fullName = fullName.replace(/\[/g, '["');
fullName = fullName.replace(/\]/g, '"]');
eval("var "+fullName+";");

Но я получаю ошибку: missing ; before statement со стрелкой, указывающей на первую скобку в ([) "var masterkey["key1"]["key2"];"

Я знаю, что eval() не годится для использования, поэтому, если у вас есть какие-либо предложения, желательно без них, я был бы очень благодарен!

Ответы [ 4 ]

4 голосов
/ 09 февраля 2012

Не самая красивая, но у меня это сработало:

var
  path = "masterkey[key1][key2]",
  scope = {};

function helper(scope, path, value) {
  var path = path.split('['), i = 0, lim = path.length;
  for (; i < lim; i += 1) {
    path[i] = path[i].replace(/\]/g, '');

    if (typeof scope[path[i]] === 'undefined') {
      scope[path[i]] = {};
    }

    if (i === lim - 1) {
      scope[path[i]] = value;
    }
    else {
      scope = scope[path[i]];
    }
  }
}

helper(scope, path, 'somevalue');

console.log(scope);

демо: http://jsfiddle.net/hR8yM/

1 голос
/ 09 февраля 2012
function parse(s, obj) {
    s.match(/\w+/g).reduce(function(o, p) { return o[p] = {} }, obj);
    return obj;
}

console.dir(parse("masterkey[key1][key2]", {}))
0 голосов
/ 09 февраля 2012

1) При использовании eval аргумент, который вы предоставляете, должен быть действительным, полный javascript.

Линия

 var masterkey["key1"]["key2"];

не является допустимым оператором JavaScript.

При назначении значения переменной необходимо использовать =. Простое объединение некоторых значений в конце имени переменной не будет работать.

2) var masterkey = ["key1"]["key2"] не имеет смысла.

Это похоже на попытку присвоить свойству «key2» свойства «key1» ничего для masterkey.

Если вы хотите, чтобы результат был похож на пример объекта, который вы даете, то это то, что вам нужно создать. Тем не менее, правильный синтаксический анализ строки для создания объекта лучше, чем использование регулярных выражений для преобразования ее в некоторый сценарий для оценки.

0 голосов
/ 09 февраля 2012

Теперь попробуйте это

string = "masterkey[key1][key2]";
var fullName = string;
fullName = fullName.replace(/\[/g, '[\'');
fullName = fullName.replace(/\]/g, '\']');

document.write("var "+fullName+";");
...