将字符串转换为javascript关联数组

时间:2012-02-09 09:05:02

标签: javascript string json associative-array javascript-objects

我有一个字符串

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 个答案:

答案 0 :(得分:4)

不是最美丽的,但它对我有用:

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 :(得分:1)

function parse(s, obj) {
    s.match(/\w+/g).reduce(function(o, p) { return o[p] = {} }, obj);
    return obj;
}

console.dir(parse("masterkey[key1][key2]", {}))

答案 2 :(得分:0)

现在试试这个

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

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

答案 3 :(得分:0)

1)使用eval时,您提供的参数必须是有效的,完整的javascript。

该行

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

不是有效的javascript语句。

为变量赋值时,必须使用=。简单地将一些值连接到变量名称的末尾将不起作用。

2)var masterkey = ["key1"]["key2"]没有意义。

这看起来像是尝试将“key1”属性的“key2”属性赋值为masterkey。

如果您希望结果与您提供的示例对象相似,那么您需要创建该对象。也就是说,正确解析字符串以创建对象比使用正则表达式将其转换为某些要评估的脚本更好。