如何将字符串解析为哈希表

是否有一种简单的(甚至是单一且简单的命令)方法来构建一个哈希表(关联数组,JSON – 无论如何)来自包含键值对的字符串,由给定的分隔符分隔。

示例

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

例2

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

谢谢!

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

 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 

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

 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 }, {}) 

地图 , 减少

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

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

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

 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', ';') 
 var stuff = "n1=v1&n2=v2&n3=v3".split("&"), moreStuff = [], hashStuff = {}, i = 0, l = stuff.length; for (;i 

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

 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 
 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, '"},{"') + '"}]') 

常用表达。

请参阅http://www.regular-expressions.info/javascript.html ( 字符串类的Regexp方法部分)中的摘要:

使用字符串的split()方法,您可以使用正则表达式将字符串拆分为字符串数组,以确定字符串分割的位置。 例如,myArray = myString.split(/,/)将逗号分隔的列表拆分为数组。 逗号本身不包含在生成的字符串数组中。

编辑

您也可以参考其他问题: 在JavaScript中解析查询字符串

不像’内置’那样’容易’,但……

 var myQueryString = "n1=v1&n2=v2&n3=v3"; var delim = '&'; var vars = myQueryString.split(delim); var parsed = {}; for (var i=0; i 

结果已parsed

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

它没有error handling。 如果你想解析location.search那么你必须做解码...

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