如何将字符串解析为哈希表
是否有一种简单的(甚至是单一且简单的命令)方法来构建一个哈希表(关联数组,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));