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

时间:2012-01-30 12:48:26

标签: javascript jquery

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

示例

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

示例2

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

谢谢!

10 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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', ';')

答案 2 :(得分:3)

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

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

mapreduce

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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 :(得分:1)

正则表达式。

http://www.regular-expressions.info/javascript.html字符串类的Regexp方法部分)中查看此摘要:

  

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

修改

您也可以参考其他问题:Parse query string in JavaScript

答案 7 :(得分:1)

不像'内置'那样“容易”,但是......

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

答案 8 :(得分:1)

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那么你必须进行解码......

答案 9 :(得分:1)

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