我有一个URL参数red=3&red=5&blue=xyz&green=true
,我需要将其解析为字典({red:[3,5], blue:['xyz'], green:[true]})
。感谢我对当前方法的更优雅解决方案:
> var args = ('red=3&red=5&blue=xyz&green=true').split('&');
> d = {};
> for(var i=0; i<args.length; i++){
var a = args[i].split('=');
var key = a[0];
if(d[key] == undefined){
d[key] = [ a[1] ];
} else { d[key].push( a[1] ); }
}
> d
{…}
blue: Array [ "xyz" ]
green: Array [ "true" ]
red: Array [ "3", "5" ]
__proto__: Object { … }
答案 0 :(得分:0)
您可以尝试reduce
。请参阅下面的解决方案。
var qr = 'red=3&red=5&blue=xyz&green=true';
var obj = decodeURI(qr).split('&').reduce(function(acc, item) {
var key = item.split('=')[0];
var val = item.split('=')[1];
if (acc[key] && Array.isArray(acc[key])) {
acc[key].push(val);
} else if (acc[key] && !Array.isArray(acc[key])) {
acc[key] = [acc[key]].concat([val])
} else {
acc[key] = val;
}
return acc;
}, {});
console.log(obj);
如果您想转换numbers
和booleans
,则可以添加如下附加条件。不确定,转换是否是最佳解决方案。
var qr = 'red=3&red=5&blue=xyz&green=true';
var obj = decodeURI(qr).split('&').reduce(function(acc, item) {
var key = item.split('=')[0];
var val = item.split('=')[1];
if (val == 'true' || val === 'false' || !isNaN(val)) {
val = eval(val);
}
if (acc[key] && Array.isArray(acc[key])) {
acc[key].push(val);
} else if (acc[key] && !Array.isArray(acc[key])) {
acc[key] = [acc[key]].concat([val])
} else {
acc[key] = val;
}
return acc;
}, {});
console.log(obj);
答案 1 :(得分:0)
如果您需要,可以尝试以下解决方案:
var d = {};
var args = 'red=3&red=5&blue=xyz&green=true';
args.split('&').map((a, b) => {
d[a.split('=')[0]] = (typeof d[a.split('=')[0]] === 'undefined')?[]:d[a.split('=')[0]];
switch(true){
case a.split('=')[1].toLowerCase() == 'true' || a.split('=')[1].toLowerCase() == 'false':
case String(Number(a.split('=')[1]))!= 'NaN':
d[a.split('=')[0]].push(eval(a.split('=')[1]));
break;
default:
d[a.split('=')[0]].push(a.split('=')[1]);
}
});
console.log(d);
答案 2 :(得分:0)
感谢所有建议。根据@Rajesh的建议,我认为这可能是最好的:
var args = ('red=3&red=5&blue=xyz&green=true').split('&');
d = {};
for(var i=0; i<args.length; i++){
var a = args[i].split('=');
d[a[0]] = d[a[0]] || []
d[a[0]].push(a[1])
}