有效地解析字典的URL参数

时间:2017-12-15 10:35:56

标签: javascript

我有一个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 { … }

3 个答案:

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

如果您想转换numbersbooleans,则可以添加如下附加条件。不确定,转换是否是最佳解决方案。

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