将document.cookie等字符串转换为对象

时间:2011-02-18 22:44:07

标签: javascript arrays string object

我有一个与document.cookie类似的字符串:

var str = 'foo=bar, baz=quux';

将其转换为数组非常简单:

str = str.split(', ');
for (var i = 0; i < str.length; i++) {
    str[i].split('=');
}

它产生这样的东西:

[['foo', 'bar'], ['baz', 'quux']]

转换为对象(在这种情况下更合适)更难。

str = JSON.parse('{' + str.replace('=', ':') + '}');

这会生成一个像这样的对象,它是无效的:

{foo: bar, baz: quux}

我想要一个这样的对象:

{'foo': 'bar', 'baz': 'quux'}

注意:我在我的示例中使用了单引号,但在发布代码时,如果您使用JSON.parse(),请记住它需要双引号而不是单。


更新

谢谢大家。这是我将使用的功能(供将来参考):

function str_obj(str) {
    str = str.split(', ');
    var result = {};
    for (var i = 0; i < str.length; i++) {
        var cur = str[i].split('=');
        result[cur[0]] = cur[1];
    }
    return result;
}

13 个答案:

答案 0 :(得分:8)

为什么你在这里需要JSON.parse?修改数组示例

str = str.split(', ');
var result = {};
for (var i = 0; i < str.length; i++) {
    var cur = str[i].split('=');
    result[cur[0]] = cur[1];
}

修改
An example说服你。

答案 1 :(得分:4)

注意: document.cookie(问题标题)是分号分隔而不是逗号分隔(问题)......

使用reduce的替代方案:

var str = 'foo=bar; baz=quux';
var obj = str.split(/[;] */).reduce(function(result, pairStr) {
  var arr = pairStr.split('=');
  if (arr.length === 2) { result[arr[0]] = arr[1]; }
  return result;
}, {});

答案 2 :(得分:4)

最短路

 document.cookie.split('; ').reduce((prev, current) => {
    const [name, value] = current.split('=');
    prev[name] = value;
    return prev
  }, {});

答案 3 :(得分:2)

给定包含中间形式的数组a

[['foo', 'bar'], ['baz', 'quux']]

然后简单地说:

var obj = {};
for (var i = 0; i < a.length; ++i) {
   var tmp = a[i];
   obj[tmp[0]] = tmp[1];
}

答案 4 :(得分:2)

要将其转换为对象,只需从头开始:

var obj = {};
str = str.split(', ');
for (var i = 0; i < str.length; i++) {
    var tmp = str[i].split('=');
    obj[tmp[0]] = tmp[1];
}

然后,如果你想要JSON:

var jsonString = JSON.stringify(obj);

答案 5 :(得分:1)

我是John Resig "Search and don't replace"这种方法的粉丝:

var str = 'foo=bar, baz=quux',
    arr = [],
    res = '{';

str.replace(/([^\s,=]+)=([^,]+)(?=,|$)/g, function ($0, key, value) { 
    arr.push('"' + key + '":"' + value + '"');
});

res += arr.join(",") + "}";

alert(res);

工作示例:http://jsfiddle.net/cm6MT/

在不需要JSON支持的情况下使事情变得简单得多。当然,使用exec()match()的相同正则表达式同样容易。

<小时/> 哎呀,我以为你想转换成JSON字符串,而不是对象。在这种情况下,您只需稍微修改代码:

var str = 'foo=bar, baz=quux',
    res = {};

str.replace(/([^\s,=]+)=([^,]+)(?=,|$)/g, function ($0, key, value) { 
    res[key] = value;
});
console.log(res.foo);
//-> "bar"

工作示例2:http://jsfiddle.net/cm6MT/1/

答案 6 :(得分:1)

上述大多数解决方案都无法使用Google设置的__gads cookie,因为它在cookie值中使用了'='字符。

解决方案是使用正则表达式而不是调用split('=')

document.cookie.split(';').reduce((prev, current) => {
  const [name, value] = current.split(/\s?(.*?)=(.*)/).splice(1, 2);
  prev[name] = value;
  return prev;
}, {});

答案 7 :(得分:0)

这是非常糟糕的数据,只要它不使用,=这将适用于该数据

var text = 'foo=bar, baz=quux',
    pattern = new RegExp(/\b([^=,]+)=([^=,]+)\b/g),
    obj = {};

while (match = pattern.exec(text)) obj[match[1]] = match[2];

console.dir(obj);

答案 8 :(得分:0)

更新解决方案的备用版本,用于检查null /空字符串,只返回一个空对象,并允许使用自定义分隔符。

function stringToObject(str, delimiter) {
    var result = {};
    if (str && str.length > 0) {
        str = str.split(delimiter || ',');
        for (var i = 0; i < str.length; i++) {
            var cur = str[i].split('=');
            result[cur[0]] = cur[1];
        }
    }
    return result;
}

答案 9 :(得分:0)

在一行中解析cookie(IE9 +):

document.cookie.split('; ').reduce(function(result, v, i, a) { var k = v.split('='); result[k[0]] = k[1]; return result; }, {})

答案 10 :(得分:0)

URLSearchParams + Object.fromEntries

用于Cookie

Object.fromEntries(new URLSearchParams(document.cookie.replace(/; /g, "&")))

您的案子

Object.fromEntries(new URLSearchParams(str.replace(/, /g, "&")))

如果转换后的字符串可以包含特殊符号,则不建议这样做

答案 11 :(得分:0)

发生在我身上的第一件事,我将其保留为原始版本,但cookie不应为空,否则会出现json解析错误

JSON.parse(`{"${document.cookie.replace(/=/g,'":"').replace(/; /g,'","')}"}`)

快速可靠的版本-Cookie到对象

let c=document.cookie.split('; '),i=c.length,o={};
while(i--){let a=c[i].split('=');o[a[0]]=a[1]}

和获取单个cookie的简短功能

getCookie=e=>(e=document.cookie.match(e+'=([^;]+)'),e&&e[1])

答案 12 :(得分:0)

function getCookie(){
   var o=document.cookie.split("; ");
   var r=[{}];
   for(var i=0;i<o.length;i++){
      r[o[i].split("=")[0]] = o[i].split("=")[1];
   }
   return r;
}

只需调用 getCookie() 即可返回当前网站的所有 cookie。 如果您有一个名为 'mycookie' 的 cookie,您可以运行 getCookie()['mycookie'];,它会返回 cookie 'mycookie' 的值。 还有一个单行选项:

function getCookie(){var o=document.cookie.split("; ");var r=[{}];for(var i=0;i<o.length;i++){r[o[i].split("=")[0]] = o[i].split("=")[1];}return r;}

这个可以使用与上面相同的方法。