2008-09-21 11 views

Respuesta

133

Aquí van:

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

Uso:

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

Al iterar con 'for', use [hasOwnProperty] (http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty) para garantizar la interoperabilidad. – troelskn

+3

@troelskn, buen punto ... aunque en este caso, alguien tendría que extender Object.prototype para romperlo, lo cual es una muy mala idea para empezar. – Shog9

+1

@ Shog9 ¿Por qué es una mala idea? –

7

Si está utilizando Prototype hay Form.serialize

Si está utilizando jQuery Hay Ajax/serialize

No sé de ningún funciones independientes para lograr esto, sin embargo, pero una búsqueda en Google de que se presentó algunas opciones prometedoras si actualmente no está utilizando una biblioteca. Si no lo eres, sin embargo, deberías hacerlo porque son el paraíso.

+5

jQuery.param() toma objeto y transformarlo a GET cadena de consulta (esta función coincide mejor con la pregunta). – azurkin

-8

Este thread apunta a algún código para el escape de URL en php. Hay escape() y unescape() que harán la mayor parte del trabajo, pero es necesario agregar un par de cosas adicionales.

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 maneja esto y no usa incorrectamente + para un espacio. – AnthonyWJones

58

funcional

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

¡Bonito! .map() se ha implementado en JavaScript 1.6, por lo que casi todos los navegadores, incluso los de abuelita, lo admiten. Pero como puedes adivinar, IE no excepto IE 9+. Pero no te preocupes, hay una solución. Fuente: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map#Browser_compatibility –

+0

'var data = {bloop1: true, bloop2:" something "}; var url = "https://something.com/?"; var params = encodeData (datos); var finalUrl = url + params; // ¿Es este el uso correcto? '¿Debería producir' https: //www.something.com/? Bloop1 = true & bloop2 = something'? –

7

Hemos acaba de publicar arg.js, un proyecto destinado a resolver este problema de una vez por todas. Tradicionalmente ha sido tan difícil, pero ahora se puede hacer:

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

y obras de lectura:

var name = Arg("name"); 

o conseguir la totalidad del lote:

var params = Arg.all(); 

y si se preocupan por la diferencia entre ?query=true y #hash=true luego puede usar los métodos Arg.query() y Arg.hash().

17

Zabba ha proporcionado en un comentario sobre la respuesta aceptada actualmente una sugerencia que para mí es la mejor solución: use jQuery.param().

Si uso jQuery.param() en los datos de la pregunta original, entonces el código es simplemente:

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

La variable params habrá

"var1=value&var2=value" 

Para más complicada ejemplos, entradas y salidas, ver la documentación jQuery.param().

2

Una pequeña modificación al texto mecanografiado:

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

al igual que volver a examinar esta cuestión casi 10 años de edad. En esta era de programación disponible, su mejor opción es configurar su proyecto usando un administrador de dependencias (npm). Existe toda una industria casera de bibliotecas que codifica las cadenas de consulta y se ocupa de todos los casos extremos. Este es uno de los más populares -

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

Cuestiones relacionadas