Sin conocer las claves de un JavaScript Object
, ¿cómo puedo convertir algo como ...
var obj = {
param1: 'something',
param2: 'somethingelse',
param3: 'another'
}
obj[param4] = 'yetanother';
...dentro...
var str = 'param1=something¶m2=somethingelse¶m3=another¶m4=yetanother';
...?
javascript
bobsoap
fuente
fuente
Respuestas:
Ejemplo: http://jsfiddle.net/WFPen/
fuente
{ a:[ 1, 2 ], b:{ c:3, d:[ 4, 5 ], e:{ x:[ 6 ], y:7, z:[ 8, 9 ] }, f:true, g:false, h:undefined }, i:[ 10, 11 ], j:true, k:false, l:[ undefined, 0 ], m:"cowboy hat?" };
@zac a continuación, satisfará la codificación adecuada de este objeto. Parece que @UnLoCo sugirió una biblioteca NPM que también funcionará, que extrae el método de param funcional de jQuery para que sea independiente.Si usa jQuery, esto es lo que usa para parametrizar las opciones de una solicitud GET ajax:
http://api.jquery.com/jQuery.param/
fuente
Una elegante: (suponiendo que esté ejecutando un navegador o nodo moderno)
Y el equivalente de ES2017: (gracias a Lukas)
Nota: Probablemente desee usar
encodeURIComponent()
si las claves / valores no están codificados en URL.fuente
+ encodeURIComponent(obj[key])
Object.entries(obj).map(([key, val]) => `${key}=${val}`).join('&')
=${encodeURIComponent(val)}
¿Qué tal esto? Es una línea y no depende:
Úselo con la URL incorporada de esta manera:
[Editar 4 de abril de 2020]: como se menciona en los comentarios, los
null
valores se interpretarán como una cadena'null'
. Así que ten cuidado con los valores nulos.fuente
const { URLSearchParams } = require("url");
fuente
ES6:
fuente
Para un nivel profundo ...
jsFiddle .
Se habló de una función recursiva para objetos arbitrariamente profundos ...
jsFiddle .
Por supuesto, esto significa que el contexto de anidamiento se pierde en la serialización.
Si los valores no están codificados en URL para comenzar, y tiene la intención de usarlos en una URL, consulte JavaScript
encodeURIComponent()
.fuente
.hasOwnProperty(prop)
.fuente
Solo para el registro y en caso de que tenga un navegador compatible con ES6, aquí hay una solución con
reduce
:¡Y aquí hay un fragmento en acción!
fuente
Dado que hice tanto alboroto sobre una función recursiva, aquí está mi propia versión.
http://jsfiddle.net/userdude/Kk3Lz/2/
fuente
[]
se prefieren algunos pensamientos aleatorios (a) en lugar denew Array()
(b) Puede usardelimiter = delimiter || '&';
el argumento predeterminado (y lo deletreó mal) (c) Iterar confor ( in )
iterará sobre todas las propiedades enumerables, incluidas las cosas en la cadena del prototipo (obj.hasOwnProperty()
defiende contra esto) (d)typeof
puede mentir acerca de lo que son las cosas, por ejemplo, algunos números pueden serObject
construidos con elNumber()
constructor (e) siArray
unpush()
método para agregar miembros (f)true
es redundante. Soy un bastardo quisquilloso pero querías comentarios. :)hasOwnProperty()
; d) eso es ciertamente cierto y un buen punto; e) Nunca me he acostumbrado a usarpush()
opop()
métodos; f)break
o nobreak
, esa es la pregunta. Gracias por tu aporte detallado. :)Un código útil cuando tiene la matriz en su consulta:
fuente
Si está utilizando NodeJS 13.1 o superior, puede usar el módulo de cadena de consulta nativo para analizar cadenas de consulta.
fuente
Dale una oportunidad a esto.
Ejemplo: http://jsfiddle.net/T2UWT/
fuente
Puedes usar el
param
método de jQuery :fuente
Parece hacer el trabajo. No hay necesidad de
encodeURIComponent
. Salidashello=world&foo=bar
fuente
Si necesita una función recursiva que produzca los parámetros de URL adecuados en función del objeto proporcionado, pruebe mi Coffee-Script.
o el JavaScript compilado ...
Esto construirá cadenas de esta manera:
fuente
Un enfoque funcional.
fuente
fuente
Este método utiliza la recursividad para descender a la jerarquía de objetos y generar parámetros de estilo de rieles que los rieles interpretan como hashes incrustados. objToParams genera una cadena de consulta con un ampersand adicional al final, y objToQuery elimina el amperseand final.
fuente
Podrías usar npm lib query-string
fuente
fuente