【问题标题】:How to convert a string into a map in javascript?如何在javascript中将字符串转换为地图?
【发布时间】:2010-09-09 08:02:31
【问题描述】:

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

"param1:'test1' && param2:'test2'"

我想把它变成一个对象图,像这样:

{param:test1, param2:test2}

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

【问题讨论】:

    标签: javascript query-string


    【解决方案1】:

    我通常使用"search and don't replace"方法:

    var ret = {},
        str = "param1:'test1' && param2:'test2'";
    
    str.replace(/(\b[^:]+):'([^']+)'/g, function ($0, param, value) {
        ret[param] = value;
    });
    
    JSON.stringify(ret);
    // -> { "param1": "test1", "param2":"test2" }
    

    示例:http://jsfiddle.net/bcJ9s/

    【讨论】:

    • +1:这比我的建议强一点。仍然可以改进;如果标识符和冒号之间有空格,则将其包含在标识符中。 :)
    • 重要的是,在这里,您是否可以预先预测“字符串”的格式,以使正则表达式尽可能简单。这将有助于将来的维护,但可能应该在某处有详细记录,以便清楚假设是什么。
    【解决方案2】:

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

    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);
    }
    

    注意,字符串当然还是字符串:{ param: 'test1', param2: 'test2' }

    【讨论】:

      【解决方案3】:

      使用 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, "");
      }
      

      【讨论】:

      • 很高兴看到其他人已经得出了几乎完全相同的解决方案 - 需要花一些时间来理解 Andy E 提供的答案,因为我从未见过 string.replac 与函数作为第二个参数。也许安迪 E 可以扩展他的答案,以造福像我这样的其他人。
      • 它很像一个正则表达式 exec(),除了没有循环并且您在它们自己的私有闭包中命名子捕获。这就是为什么我链接到 John Resig 创造该术语并解释该方法的文章 :-)
      • @Guffa - 非常正确,这就是为什么 Andy E 提供的答案很有趣。
      • @Andy E - 没有发现链接。感谢您指出 - 使用返回字符串而不是字符串的函数很容易理解,但我不知道该函数具有传递给它的正则表达式搜索的某些方面。像往常一样,雷西格先生最清楚。 :-)
      【解决方案4】:

      使用字符串处理(正如@Guffa 所说,如果字符串本身包含&amp;&amp;:,它将失败):

      var str="param1:'test1' && param2:'test2'";
      var map={};
      var pairs=str.split('&&');
      for(i=0, total=pairs.length; i<total; i++) {
        var pair=pairs[i].trim().split(':');
        map[pair[0]]=pair[1].substr(1, pair[1].length-2);
      }
      

      注意:trim()在旧浏览器上不可用,您需要在上面的[src]之前添加这段代码:

      if (!String.prototype.trim) {
          String.prototype.trim = function () {
              return this.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, "$1");
          };
      }
      

      【讨论】:

      • 你是对的,我想到了这一点,但阅读了你在答案上方所说的内容,所以我认为其他人提到了这个我不需要,但我可能也应该编辑提到这个,谢谢.
      猜你喜欢
      • 2020-01-09
      • 2015-12-26
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 2016-09-27
      相关资源
      最近更新 更多