2015-09-28 3 views
1

У меня возникли проблемы с применением reduce к Object, чтобы получить его в формате запроса.Javascript Object to querystring using reduce

Я хочу это:

> var obj = {a: 1, b: "213123", c: null, d:false} 
> obj2querystring(obj); 
a=1&b=213123&c=null&d=false 

До сих пор близко я получил это:

Object.keys(obj).reduce(function(prev, curr){ 
    return prev + '&' + curr + '=' + obj[curr]; 
}, ''); 

, который дает мне:

&a=1&b=213123&c=null&d=false 

Есть ли более простой способ достигните этого, не добавляйте значение initialValue и удалите & позже?

ответ

4

Вместо того, чтобы делать reduce, более чистый способ будет map и join.

Object.keys(obj).map(function(x){ 
    return x + '=' + obj[x]; 
}).join('&'); 
  • карта делает и массив как это: ["a=1", "b=213123", "c=null", "d=false"]
  • присоединиться превращает его в строку запроса: a=1&b=213123&c=null&d=false
+0

Спасибо! Именно то, что мне нужно. –

3

Вы можете использовать map с join:

return Object.keys(obj).map(function(i) { 
    return i + '=' + obj[i]; 
}).join('&'); 

И это важно использовать encodeURIComponent с обеих сторон QueryString:

return Object.keys(obj).map(function(i) { 
    return encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]); 
}).join('&'); 

Если вам нужно QueryString обратно в любое время:

location.search.slice(1).split('&').map(function(i) { 
    var arr = i.split('='); 
    var a = {}; 
    a[decodeURIComponent(arr[0])] = arr[1] ? decodeURIComponent(arr[1]) : void 0; 
    return a; 
}).reduce(function(a, b) { 
    var key = Object.keys(b)[0]; 
    a[key] = b[key]; 
    return a; 
}); 
+0

Вы получаете upvote для 'encodeURIComponent'. – Barmar