2017-12-15 6 views
0

私は辞書({red:[3,5], blue:['xyz'], green:[true]})を解析する必要があるURL引数red=3&red=5&blue=xyz&green=trueを持っています。私の現在のアプローチのいずれかのよりエレガントな解決策に向けたポインタに感謝:辞書へのURL引数の効率的な解析

> 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

おかげで、匿名downvoterを:@Rajeshの提案に基づいて、私はこれはおそらく、恋愛小説家だと思います! – geotheory

+2

私は "d.hasOwnProperty(key)"の代わりに未定義のテストを提案します。 – flowtron

+0

役に立つチップtx @flowtron – geotheory

答えて

0

おかげで、すべてを。

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

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); 
関連する問題