如何在javascript中将字符串转换为映射?

如何在javascript中将字符串转换为映射?,javascript,query-string,Javascript,Query String,例如,我们有一个查询字符串,如下所示: "param1:'test1' && param2:'test2'" {param:test1, param2:test2} 我想将其转换为对象贴图,如下所示: "param1:'test1' && param2:'test2'" {param:test1, param2:test2} 这怎么可能呢?这似乎是一个非常常见的用例。只要它是这种格式,即只有字符串值(并且字符串不包含“&&&”或冒号),您就可以轻松地解析它

例如,我们有一个查询字符串,如下所示:

"param1:'test1' && param2:'test2'"
{param:test1, param2:test2}
我想将其转换为对象贴图,如下所示:

"param1:'test1' && param2:'test2'"
{param:test1, param2:test2}

这怎么可能呢?这似乎是一个非常常见的用例。

只要它是这种格式,即只有字符串值(并且字符串不包含
“&&&”
或冒号),您就可以轻松地解析它:

var params = theString.split(' && ');
var map = {};
for (var i = 0; i < params.length; i++) {
  var parts = params[i].split(':');
  map[parts[0]] = parts[1].substr(1, parts[1].length - 2);
}
var params=theString.split('&&');
var-map={};
对于(变量i=0;i
请注意,字符串当然仍然是字符串:
{param:'test1',param2:'test2'}

我通常使用以下方法:

示例:

使用字符串处理(如@Guffa所述,如果字符串本身包含
&&
,则处理将失败):


使用string.split函数将字符串拆分为所需的部分-类似于以下内容

var input = "param1:'test1' && param2:'test2'";
var entries = input.split(" && ");
var map = {};
var pattern = /'/g;
for(var i=0; i < entries.length; i++){
    var tokens = entries[i].split[":"];
    map[tokens[0]] = tokens[1].replace(pattern, "");
}
var input=“param1:'test1'&¶m2:'test2';
var条目=输入。拆分(&&);
var-map={};
变量模式=/'/g;
对于(变量i=0;i
看到其他人几乎得出了完全相同的解决方案,我感到相当满意-需要花一些时间来理解Andy E提供的答案,因为我从未见过string.replac与函数一起用作第二个参数。也许Andy E可以为我这样的其他人扩展他的答案。这很像regex exec(),只是没有循环,您在自己的私有闭包中命名子捕获。这就是为什么我链接到一篇文章,其中John Resig创造了这个词并解释了这个方法:-)@Guffa-非常正确,这就是为什么Andy E提供的答案很有趣的原因。@Andy E-没有发现链接。感谢您指出这一点-使用返回字符串而不是字符串的函数很容易理解,但我不知道该函数传递了regexp搜索的某些方面。和往常一样,雷西格先生最清楚。:-)你是对的,我想到了这一点,但是读了你在你的答案上面所说的,所以我认为其他人提到了这一点,我不必,但我也应该编辑提及这一点,谢谢。还有待改进;如果标识符和冒号之间有空格,则它将包含在标识符中。:)这里重要的是,您是否可以预先预测“字符串”的格式,以便使regexp尽可能简单。这将有助于将来的维护,但可能应该在某个地方做好记录,以便清楚地知道假设是什么。
var input = "param1:'test1' && param2:'test2'";
var entries = input.split(" && ");
var map = {};
var pattern = /'/g;
for(var i=0; i < entries.length; i++){
    var tokens = entries[i].split[":"];
    map[tokens[0]] = tokens[1].replace(pattern, "");
}