【问题标题】:How to parse a string into a hashtable如何将字符串解析为哈希表
【发布时间】:2012-02-22 06:17:36
【问题描述】:

是否有一种简单(甚至可能是单个简单命令)的方法来从包含键值对的字符串构建哈希表(关联数组,JSON 等等),由给定的分隔符分隔。

示例

n1=v1&n2=v2&n3=v3(其中& 是分隔符) 应该返回:[{n1:v1}, {n2:v2}, {n3:v3}]

示例 2

n1=v1;n2=v2;n3=v3(其中; 是分隔符)

谢谢!

【问题讨论】:

标签: javascript jquery


【解决方案1】:

以下将以一种非常基本的方式执行此操作,并检查每种情况下的键是否为空。所有值都是字符串。

function parse(str, separator) {
    var parsed = {};
    var pairs = str.split(separator);
    for (var i = 0, len = pairs.length, keyVal; i < len; ++i) {
        keyVal = pairs[i].split("=");
        if (keyVal[0]) {
            parsed[keyVal[0]] = keyVal[1];
        }
    }
    return parsed;
}

例子:

var props = parse("n1=v1&n2=v2&n3=v3", "&");
alert(props.n2); // Alerts v2

【讨论】:

    【解决方案2】:

    假设您使用的是现代浏览器:

    str = "n1=v1&n2=v2&n3=v3"
    delim = "&"
    
    obj = str.split(delim).
        map(function(s) { return s.split("=") }).
        reduce(function(p, s) { return p[s[0]] = s[1], p }, {})
    

    map, reduce

    作为奖励,这在云中运行时也可以很好地扩展(请参阅http://en.wikipedia.org/wiki/MapReduce)。

    【讨论】:

      【解决方案3】:

      注意:这会产生指定的[{n1:'v1'}, {n2:'v2'}] 格式,而不是更适合Hashtable 描述的{ n1: 'v1', n2: 'v2' } 格式。

      如果您可以在除定界符之外的所有其他方面信任您的输入,那么它看起来像这样:

      function splitByDelimiter(input, delimiter) {
          var parts = input.split(delimiter);
          var output = [];
          for(var i = 0; i < parts.length; i++) {
              var item = {};
              var keyValue = parts[i].split('=');
              item[keyValue[0]] = keyValue[1];
      
              output.push(item);
          }
          return output;
      }
      
      splitByDelimiter('n1=v1;n2=v2;n3=v3', ';')
      

      【讨论】:

        【解决方案4】:
        var stuff = "n1=v1&n2=v2&n3=v3".split("&"),
        moreStuff = [],
        hashStuff = {},
        i = 0, l = stuff.length;
        
        for (;i<l;i++) {
          moreStuff = stuff[i].split("=");
          hashStuff[moreStuff[0]] = moreStuff[1];
        }
        

        【讨论】:

          【解决方案5】:

          我的尝试,不是一个有效的:(

          query  = 'n1=v1&n2=v2&n3=v3'.split('&')
          obj = {}
          
          $.each(arr,function(k,v){
          key = v.split('=')[0]
          value = v.split('=')[1];
          obj[key] = value;
          })
          
          obj.n1 outputs v1
          

          【讨论】:

            【解决方案6】:
            var str = "n1=v1&n2=v2&n3=v3";
            
            var arr = eval('[{' + str.replace(/=/g, ':"').replace(/&/g, '"},{') + '"}]');
            

            或者如果你不喜欢eval

            var arr = jQuery.parseJSON('[{"' + str.replace(/=/g, '":"').replace(/&/g, '"},{"') + '"}]')
            

            【讨论】:

              【解决方案7】:

              正则表达式。

              请参阅http://www.regular-expressions.info/javascript.html 的摘要(字符串类的正则表达式方法部分):

              使用字符串的 split() 方法可以将字符串拆分为 使用正则表达式确定位置的字符串数组 字符串被拆分的位置。例如。 myArray = myString.split(/,/) 将逗号分隔的列表拆分为数组。逗号是自己 不包含在结果字符串数组中。

              编辑

              你也可以参考这个问题:Parse query string in JavaScript

              【讨论】:

                【解决方案8】:

                不像“内置”那样“简单”,但是...

                var myQueryString = "n1=v1&n2=v2&n3=v3";
                var delim = '&';
                
                var vars = myQueryString.split(delim);
                
                var parsed = {};
                for (var i=0; i<vars.length; i++) { 
                    var kvPair = vars[i].split("="); 
                    parsed[kvPair[0]] = kvPair[1];
                }
                

                结果在parsed

                【讨论】:

                  【解决方案9】:
                  function parseStr2Map(str) {
                      var elems = str.split("&");
                      var map = {};
                      for (var i = 0; i < elems.length; i++) {
                          var nvPair = elems[i].split("=");
                          map[nvPair[0]] = nvPair[1];
                      }
                      return map;
                  }
                  

                  没有错误处理。 如果要解析 location.search 则必须进行解码...

                  【讨论】:

                    【解决方案10】:
                    var input = 'n1=v1&n2=v2&n3=v3';
                    var tokens = input.split('&');
                    var hashTable = {};
                    
                    for (var i = 0; i < tokens.length; i++) {
                        var keyValuePair = tokens[i].split('=');
                        var key = keyValuePair[0];
                        var value = keyValuePair[1];
                    
                        hashTable[key] = value;
                    }
                    
                    alert(JSON.stringify(hashTable));
                    

                    【讨论】:

                      猜你喜欢
                      • 2019-04-04
                      • 2014-07-10
                      • 2012-01-26
                      • 2013-02-04
                      • 2014-07-24
                      • 1970-01-01
                      • 2012-10-12
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多