我有一个与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;
}
答案 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"
答案 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;}
这个可以使用与上面相同的方法。