2008-09-21 7 views

Répondre

133

Ici, vous allez:

function encodeQueryData(data) { 
    let ret = []; 
    for (let d in data) 
    ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d])); 
    return ret.join('&'); 
} 

Utilisation:

var data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 }; 
var querystring = encodeQueryData(data); 
+8

Lors de l'itération avec 'for', utilisez [hasOwnProperty] (http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty) pour assurer l'interopérabilité. – troelskn

+3

@troelskn, bon point ... bien que dans ce cas, quelqu'un devrait étendre Object.prototype pour le casser, ce qui est une très mauvaise idée pour commencer. – Shog9

+1

@ Shog9 Pourquoi est-ce une mauvaise idée? –

7

Si vous utilisez Prototype il y a Form.serialize

Si vous utilisez jQuery il y a Ajax/serialize

Je ne connais pas de fonctions indépendantes pour ce faire, cependant, mais une recherche google pour elle relevai quelques options prometteuses si vous n'utilisez pas actuellement une bibliothèque. Si vous n'êtes pas, cependant, vous devriez vraiment parce qu'ils sont le paradis.

+5

jQuery.param() prend l'objet et le transformer GET chaîne de requête (cette fonction correspond mieux à la question). – azurkin

-8

Ce thread pointe vers du code pour l'échappement d'URL en php. Il y a escape() et unescape() qui feront le plus gros du travail, mais vous devez ajouter quelques éléments supplémentaires.

function urlencode(str) { 
str = escape(str); 
str = str.replace('+', '%2B'); 
str = str.replace('%20', '+'); 
str = str.replace('*', '%2A'); 
str = str.replace('/', '%2F'); 
str = str.replace('@', '%40'); 
return str; 
} 

function urldecode(str) { 
str = str.replace('+', ' '); 
str = unescape(str); 
return str; 
} 
+1

encodeURIComponent gère ceci et n'utilise pas incorrectement + pour un espace. – AnthonyWJones

58

fonctionnelle

function encodeData(data) { 
    return Object.keys(data).map(function(key) { 
     return [key, data[key]].map(encodeURIComponent).join("="); 
    }).join("&"); 
} 
+1

Nice one! .map() a été implémenté dans JavaScript 1.6, donc presque tous les navigateurs, même les mamans le supportent. Mais comme vous pouvez le deviner IE ne fait pas exception IE 9+. Mais ne vous inquiétez pas, il existe une solution de contournement. Source: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map#Browser_compatibility –

+0

'var data = {bloop1: true, bloop2:" quelque chose "}; var url = "https://something.com/?"; var params = encodeData (données); var finalUrl = url + params; // Est-ce le bon usage? 'Devrait produire' https: //www.something.com/? Bloop1 = true & bloop2 = quelque chose? –

7

Nous venons de publier arg.js, un projet visant à résoudre ce problème une fois pour toutes. Il est traditionnellement été si difficile, mais maintenant vous pouvez le faire:

var querystring = Arg.url({name: "Mat", state: "CO"}); 

Et la lecture fonctionne:

var name = Arg("name"); 

ou d'obtenir le tout:

var params = Arg.all(); 

et si vous vous souciez de la différence entre ?query=true et #hash=true puis vous pouvez utiliser les méthodes Arg.query() et Arg.hash().

17

Zabba a fourni dans un commentaire sur la réponse actuellement acceptée une suggestion qui pour moi est la meilleure solution: utiliser jQuery.param().

Si je jQuery.param() sur les données de la question initiale, le code est tout simplement:

var params = jQuery.param({ 
    var1: 'value', 
    var2: 'value' 
}); 

La variable params sera

"var1=value&var2=value" 

Pour des exemples plus complexes, les entrées et sorties, Voir la documentation jQuery.param().

2

Une petite modification tapuscrit:

public encodeData(data: any): string { 
    return Object.keys(data).map((key) => { 
     return [key, data[key]].map(encodeURIComponent).join("="); 
    }).join("&"); 
    } 
2

comme vous venez de revenir sur cette vieille question près de 10 ans. En cette ère de programmation sur étagère, votre meilleur pari est de configurer votre projet en utilisant un gestionnaire de dépendance (npm). Il y a toute une industrie artisanale de bibliothèques qui encodent des chaînes de requête et s'occupent de tous les cas marginaux. Ceci est l'un des plus plus populaires -

https://www.npmjs.com/package/query-string

Questions connexes