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

Javascript 如何将字符串解析为哈希表,javascript,jquery,Javascript,Jquery,有没有一种简单的方法(甚至可能是一个简单的命令)从包含键值对的字符串(由给定的分隔符分隔)构建哈希表(关联数组,JSON-无论什么) 示例: n1=v1&n2=v2&n3=v3(其中&是分隔符) 应该返回:[{n1:v1},{n2:v2},{n3:v3}] 示例2: n1=v1;n2=v2;n3=v3(其中;是分隔符) 谢谢 正则表达式 请参阅(字符串类的Regexp方法部分)中的此摘要: 使用字符串的split()方法可以将字符串拆分为 使用正则表达式确定位置的字符串数组 此时字符串被拆分。例

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

示例

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

示例2

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

谢谢

正则表达式

请参阅(字符串类的Regexp方法部分)中的此摘要:

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

编辑


您也可以参考另一个问题:

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

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 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];
}
var myQueryString=“n1=v1&n2=v2&n3=v3”;
变量delim='&';
var vars=myQueryString.split(delim);
var解析={};
对于(var i=0;i
var stuff=“n1=v1&n2=v2&n3=v3”,
moreStuff=[],
hashStuff={},
i=0,l=stuff.length;

对于(;i注意:这将生成指定的
[{n1:'v1'},{n2:'v2'}]
格式,而不是更适合哈希表描述的
{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', ';')
函数splitByDelimiter(输入,分隔符){
var parts=input.split(分隔符);
var输出=[];
对于(变量i=0;i
函数parseStr2Map(str){
var elems=str.split(“&”);
var-map={};
对于(变量i=0;i
它没有错误处理。 如果你想解析location.search,那么你必须解码…

var input='n1=v1&n2=v2&n3=v3';
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));
var标记=输入.分割('&'); var hashTable={}; for(var i=0;i
或者如果您不喜欢
eval

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

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


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

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


另外,当在云中运行时,这也可以很好地扩展(请参见)。

该问题的可能重复与此问题不完全相同。看看答案的不同:这里本质上相同的代码的7个版本中没有一个是在假定的重复中表示的。也就是说,我想象在某个地方存在确切的重复。
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));
var str = "n1=v1&n2=v2&n3=v3";

var arr = eval('[{' + str.replace(/=/g, ':"').replace(/&/g, '"},{') + '"}]');
var arr = jQuery.parseJSON('[{"' + str.replace(/=/g, '":"').replace(/&/g, '"},{"') + '"}]')
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
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 }, {})