bart
bart

Reputation: 15288

Convert string array values from URLSearchParams

How does one convert string array values into a Javascript array object?

var querystring = 'lang[]=EN&lang[]=FR&type[]=1&type[]=2';

Into:

{
    lang: ['EN', 'FR'],
    type: ['2']
}

Below my attempt:

let params = new URLSearchParams(decodeURI(querystring));
let entries = params.entries();

let result = {}
for(let entry of entries) { // each 'entry' is a [key, value]
    result[entry[0]] = entry[1];
}
return result;

Which results in:

[{
    "name": "lang[]",
    "value": "EN"
}, {
    "name": "lang[]",
    "value": "FR"
}, {
    "name": "type[]",
    "value": "2"
}]

Upvotes: 2

Views: 8135

Answers (3)

Mark
Mark

Reputation: 92440

You should probably test for the [] so your code won't break with entries not ending in []. You can then slice off the [] so your keys don't include it:

var querystring = 'lang[]=EN&lang[]=FR&type[]=1&type[]=2&test=hello';

let params = new URLSearchParams(decodeURI(querystring));
let entries = params.entries();

let result = {}
for(let entry of entries) { // each 'entry' is a [key, value]
    let [key, val] = entry
    if (key.endsWith('[]')){         // array 
      key = key.slice(0,-2);         // clean up the key
      (result[key] || (result[key] = [])).push(val)
    } else {
      result[key] = val             // normal parameter
    }
}
console.log(result)

Upvotes: 3

Bergur
Bergur

Reputation: 4057

Simplest version would be to use a library like qs

https://www.npmjs.com/package/qs#parsing-arrays

var withArray = qs.parse('a[]=b&a[]=c');

ressults in

a: ['b', 'c'] 

Upvotes: 3

yip102011
yip102011

Reputation: 877

var querystring = 'lang[]=EN&lang[]=FR&type[]=1&type[]=2';
let params = new URLSearchParams(decodeURI(querystring));
let entries = params.entries();

let result = {}
for(let entry of entries) { // each 'entry' is a [key, value]
    var key = entry[0];
    var val = entry[1];
    if(key in result){
        result[key].push(val);
    }else{
        result[key] = [val];
    }
}
console.log(result);

Upvotes: 2

Related Questions