我目前正在尝试将 URL 查询字符串转换为 JavaScript 对象,但效果不太好。我环顾 Stack Overflow 寻找可能的解决方案,但还没有完全找到我想要的东西。这是查询字符串:
"class%5Blocation_id%5D=122&student%5Bgender%5D=&student%5Bpicture%5D=&class%5Bquestions%5D%5B2775%5D%5Banswers%5D%5B%5D=Black+canary&ids%5B%5D=32&class%5Bquestions%5D%5B2775%5D%5Banswer%5D=&class%5Bquestions%5D%5B2776%5D%5Banswers%5D%5B%5D=Blue+Whistle&class%5Bquestions%5D%5B2776%5D%5Banswer%5D=&class%5Bdescription%5D="
我正在寻找这样的东西:
{
class: {
description: '',
location_id: '122',
questions: {
2275: {
answer: '',
answers: ['Black canary']
},
2276: {
answer: '',
answers: ['Blue Whistle']
}
}
},
ids: ['32']
student: {
gender: '',
picture: ''
}
}
我尝试使用一个名为query-string的库,但这就是我得到的:
{
'class[description]': '',
'class[location_id]': '122',
'class[questions][2775][answer]': '',
'class[questions][2775][answers][]': 'Black canary',
'class[questions][2776][answer]': '',
'class[questions][2776][answers][]': 'Blue Whistle',
'ids[]': '32',
'student[gender]': '',
'student[picture]': ''
}
我尝试使用在这里找到的两个实现:
function form2Json(str) {
"use strict";
var obj, i, pt, keys, j, ev;
if (typeof form2Json.br !== 'function') {
form2Json.br = function (repl) {
if (repl.indexOf(']') !== -1) {
return repl.replace(/\](.+?)(,|$)/g, function ($1, $2, $3) {
return form2Json.br($2 + '}' + $3);
});
}
return repl;
};
}
str = '{"' + (str.indexOf('%') !== -1 ? decodeURI(str) : str) + '"}';
obj = str.replace(/\=/g, '":"').replace(/&/g, '","').replace(/\[/g, '":{"');
obj = JSON.parse(obj.replace(/\](.+?)(,|$)/g, function ($1, $2, $3) { return form2Json.br($2 + '}' + $3); }));
pt = ('&' + str).replace(/(\[|\]|\=)/g, '"$1"').replace(/\]"+/g, ']').replace(/&([^\[\=]+?)(\[|\=)/g, '"&["$1]$2');
pt = (pt + '"').replace(/^"&/, '').split('&');
for (i = 0; i < pt.length; i++) {
ev = obj;
keys = pt[i].match(/(?!:(\["))([^"]+?)(?=("\]))/g);
for (j = 0; j < keys.length; j++) {
if (!ev.hasOwnProperty(keys[j])) {
if (keys.length > (j + 1)) {
ev[keys[j]] = {};
}
else {
ev[keys[j]] = pt[i].split('=')[1].replace(/"/g, '');
break;
}
}
ev = ev[keys[j]];
}
}
return obj;
}
但最后是这样的:
{
class: {
description: "",
location_id: "122"
},
questions:{
2775: {answers: "Black+canary", answer: ""}
2776: {answers: "Blue+Whistle", answer: ""}
},
ids: {
"": "32"
},
student: {
gender: ""
picture: ""
}
}
ids
成为对象而不是数组并answers
成为字符串。我最接近它的是使用这个:
function form2Json(str) {
"use strict";
var pairs = str.split('&'),
result = {};
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('='),
key = decodeURIComponent(pair[0]),
value = decodeURIComponent(pair[1]),
isArray = /\[\]$/.test(key),
dictMatch = key.match(/^(.+)\[([^\]]+)\]$/);
if (dictMatch) {
key = dictMatch[1];
var subkey = dictMatch[2];
result[key] = result[key] || {};
result[key][subkey] = value;
} else if (isArray) {
key = key.substring(0, key.length - 2);
result[key] = result[key] || [];
result[key].push(value);
} else {
result[key] = value;
}
}
return result;
}
有了这个结果:
{
class: {location_id: "122", description: ""},
class[questions][2775]: {answer: ""},
class[questions][2775][answers]: ["Black+canary"],
class[questions][2776]: {answer: ""},
class[questions][2776][answers]: ["Blue+Whistle"],
ids: ["32"],
student: {gender: "", picture: ""}
}
...只有第一级关联,并且数组ids
被正确分配为数组。我怎样才能使这项工作?