Nap*_*lux 441 javascript urlencode query-string
您是否知道将Javascript对象编码为string可以通过GET请求传递的快速而简单的方法?
不jQuery,没有其他框架 - 只是简单的Javascript :)
use*_*291 766
像这样?
serialize = function(obj) {
var str = [];
for (var p in obj)
if (obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
return str.join("&");
}
console.log(serialize({
foo: "hi there",
bar: "100%"
}));
// foo=hi%20there&bar=100%25Run Code Online (Sandbox Code Playgroud)
编辑:这个也转换递归对象(使用php"数组"表示法查询字符串)
serialize = function(obj, prefix) {
var str = [],
p;
for (p in obj) {
if (obj.hasOwnProperty(p)) {
var k = prefix ? prefix + "[" + p + "]" : p,
v = obj[p];
str.push((v !== null && typeof v === "object") ?
serialize(v, k) :
encodeURIComponent(k) + "=" + encodeURIComponent(v));
}
}
return str.join("&");
}
console.log(serialize({
foo: "hi there",
bar: {
blah: 123,
quux: [1, 2, 3]
}
}));
// foo=hi%20there&bar%5Bblah%5D=123&bar%5Bquux%5D%5B0%5D=1&bar%5Bquux%5D%5B1%5D=2&bar%5Bquux%5D%5B2%5D=3Run Code Online (Sandbox Code Playgroud)
ben*_*vds 225
jQuery有一个函数jQuery.param(),如果你已经在使用它,你可以使用它:http:
//api.jquery.com/jquery.param/
例:
var params = { width:1680, height:1050 };
var str = jQuery.param( params );
Run Code Online (Sandbox Code Playgroud)
str 现在包含 width=1680&height=1050
ser*_*rgk 123
Object.keys(obj).reduce(function(a,k){a.push(k+'='+encodeURIComponent(obj[k]));return a},[]).join('&')
Run Code Online (Sandbox Code Playgroud)
编辑:我喜欢这个单行,但我敢打赌,如果它符合语义上接受的答案,那将是一个更受欢迎的答案:
function serialize( obj ) {
let str = '?' + Object.keys(obj).reduce(function(a, k){
a.push(k + '=' + encodeURIComponent(obj[k]));
return a;
}, []).join('&');
return str;
}
Run Code Online (Sandbox Code Playgroud)
小智 109
你能用URLSearchParams吗?
只是 URLSearchParams
但是,Chrome 49+
Nic*_*era 106
这是ES6中的单线程:
Object.keys(obj).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`).join('&');
Run Code Online (Sandbox Code Playgroud)
小智 45
const querystring = require('querystring')
const obj = {
foo: 'bar',
baz: 'tor'
}
let result = querystring.stringify(obj)
// foo=bar&baz=tor
Run Code Online (Sandbox Code Playgroud)
参考:https://nodejs.org/api/querystring.html
bma*_*ggi 35
我建议使用URLSearchParams接口:
const searchParams = new URLSearchParams();
const search = {foo: "hi there", bar: "100%" };
Object.keys(search).forEach(key => searchParams.append(key, search[key]));
console.log(searchParams.toString())
Run Code Online (Sandbox Code Playgroud)
jss*_*ian 24
用户187291对已接受解决方案的一个小修正:
serialize = function(obj) {
var str = [];
for(var p in obj){
if (obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
}
return str.join("&");
}
Run Code Online (Sandbox Code Playgroud)
检查对象上的hasOwnProperty会使JSLint/JSHint感到高兴,并且如果对象不是简单的字典,它会阻止意外地序列化对象或其他东西的方法.请参阅本页中有关语句的段落:http://javascript.crockford.com/code.html
Ale*_*nte 12
好吧,每个人似乎都把他的一个班轮放在这里,所以这里是我的:
const encoded = Object.entries(obj).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join("&");
Run Code Online (Sandbox Code Playgroud)
Tim*_*own 11
你需要发送任意对象吗?如果是这样,GET是一个坏主意,因为用户代理和Web服务器将接受的URL长度有限.我的建议是建立一个名称 - 值对数组来发送,然后建立一个查询字符串:
function QueryStringBuilder() {
var nameValues = [];
this.add = function(name, value) {
nameValues.push( {name: name, value: value} );
};
this.toQueryString = function() {
var segments = [], nameValue;
for (var i = 0, len = nameValues.length; i < len; i++) {
nameValue = nameValues[i];
segments[i] = encodeURIComponent(nameValue.name) + "=" + encodeURIComponent(nameValue.value);
}
return segments.join("&");
};
}
var qsb = new QueryStringBuilder();
qsb.add("veg", "cabbage");
qsb.add("vegCount", "5");
alert( qsb.toQueryString() );
Run Code Online (Sandbox Code Playgroud)
She*_*yar 11
此方法将Javascript对象转换为URI Query String.还处理嵌套数组和对象(在Rails/ PHPsyntax中):
function serializeQuery(params, prefix) {
const query = Object.keys(params).map((key) => {
const value = params[key];
if (params.constructor === Array)
key = `${prefix}[]`;
else if (params.constructor === Object)
key = (prefix ? `${prefix}[${key}]` : key);
if (typeof value === 'object')
return serializeQuery(value, key);
else
return `${key}=${encodeURIComponent(value)}`;
});
return [].concat.apply([], query).join('&');
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
let params = {
a: 100,
b: 'has spaces',
c: [1, 2, 3],
d: { x: 9, y: 8}
}
serializeQuery(params)
// returns 'a=100&b=has%20spaces&c[]=1&c[]=2&c[]=3&d[x]=9&d[y]=8
Run Code Online (Sandbox Code Playgroud)
这是接受答案的coffeescript版本.这可以为某人节省时间.
serialize = (obj, prefix) ->
str = []
for p, v of obj
k = if prefix then prefix + "[" + p + "]" else p
if typeof v == "object"
str.push(serialize(v, k))
else
str.push(encodeURIComponent(k) + "=" + encodeURIComponent(v))
str.join("&")
Run Code Online (Sandbox Code Playgroud)
稍微好看一点
objectToQueryString(obj, prefix) {
return Object.keys(obj).map(objKey => {
if (obj.hasOwnProperty(objKey)) {
const key = prefix ? `${prefix}[${objKey}]` : objKey;
const value = obj[objKey];
return typeof value === "object" ?
this.objectToQueryString(value, key) :
`${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
}
return null;
}).join("&");
}
Run Code Online (Sandbox Code Playgroud)
小智 7
使用:
const toQueryString = obj => "?".concat(Object.keys(obj).map(e => `${encodeURIComponent(e)}=${encodeURIComponent(obj[e])}`).join("&"));
const data = {
offset: 5,
limit: 10
};
toQueryString(data); // => ?offset=5&limit=10
Run Code Online (Sandbox Code Playgroud)
const data = {
offset: 5,
limit: 10
};
new URLSearchParams(data).toString(); // => ?offset=5&limit=10
Run Code Online (Sandbox Code Playgroud)
如果不存在,上述两种方法都会将值设置为 null。如果您不想在值为 null 时设置查询参数,则使用:
const toQueryString = obj => "?".concat(Object.keys(obj).map(e => obj[e] ? `${encodeURIComponent(e)}=${encodeURIComponent(obj[e])}` : null).filter(e => !!e).join("&"));
const data = {
offset: null,
limit: 10
};
toQueryString(data); // => "?limit=10" else with above methods "?offset=null&limit=10"
Run Code Online (Sandbox Code Playgroud)
您可以自由地使用任何方法。
这是一个带Object.entries的简洁和递归版本.它处理任意嵌套的数组,但不处理嵌套对象.它还删除了空元素:
const format = (k,v) => v !== null ? `${k}=${encodeURIComponent(v)}` : ''
const to_qs = (obj) => {
return [].concat(...Object.entries(obj)
.map(([k,v]) => Array.isArray(v)
? v.map(arr => to_qs({[k]:arr}))
: format(k,v)))
.filter(x => x)
.join('&');
}
Run Code Online (Sandbox Code Playgroud)
例如:
let json = {
a: [1, 2, 3],
b: [], // omit b
c: 1,
d: "test&encoding", // uriencode
e: [[4,5],[6,7]], // flatten this
f: null, // omit nulls
g: 0
};
let qs = to_qs(json)
=> "a=1&a=2&a=3&c=1&d=test%26encoding&e=4&e=5&e=6&e=7&g=0"
Run Code Online (Sandbox Code Playgroud)
还有另一个流行的库,qs。您可以通过以下方式添加:
yarn add qs
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
import qs from 'qs'
const array = { a: { b: 'c' } }
const stringified = qs.stringify(array, { encode: false })
console.log(stringified) //-- outputs a[b]=c
Run Code Online (Sandbox Code Playgroud)
这个跳过空/未定义的值
export function urlEncodeQueryParams(data) {
const params = Object.keys(data).map(key => data[key] ? `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}` : '');
return params.filter(value => !!value).join('&');
}
Run Code Online (Sandbox Code Playgroud)
我有一个更简单的解决方案,不使用任何第三方库,并且已经很容易在任何具有“Object.keys”的浏览器(又名所有现代浏览器 + Edge + Internet\xc2\xa0Explorer)中使用:
\n在ES5中:
\n\nfunction(a){\n if( typeof(a) !== \'object\' )\n return \'\';\n return `?${Object.keys(a).map(k=>`${k}=${a[k]}`).join(\'&\')}`;\n}\nRun Code Online (Sandbox Code Playgroud)\n在ES3中:
\n\nfunction(a){\n if( typeof(a) !== \'object\' )\n return \'\';\n return \'?\' + Object.keys(a).map(function(k){ return k + \'=\' + a[k] }).join(\'&\');\n}\nRun Code Online (Sandbox Code Playgroud)\n
小智 5
在ES7中,您可以这样写:
const serialize = (obj) => (Object.entries(obj).map(i => [i[0], encodeURIComponent(i[1])].join('=')).join('&'))
Run Code Online (Sandbox Code Playgroud)
我对JSON字符串化器进行了比较,结果如下:
JSON: {"_id":"5973782bdb9a930533b05cb2","isActive":true,"balance":"$1,446.35","age":32,"name":"Logan Keller","email":"logankeller@artiq.com","phone":"+1 (952) 533-2258","friends":[{"id":0,"name":"Colon Salazar"},{"id":1,"name":"French Mcneil"},{"id":2,"name":"Carol Martin"}],"favoriteFruit":"banana"}
Rison: (_id:'5973782bdb9a930533b05cb2',age:32,balance:'$1,446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258')
O-Rison: _id:'5973782bdb9a930533b05cb2',age:32,balance:'$1,446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258'
JSURL: ~(_id~'5973782bdb9a930533b05cb2~isActive~true~balance~'!1*2c446.35~age~32~name~'Logan*20Keller~email~'logankeller*40artiq.com~phone~'*2b1*20*28952*29*20533-2258~friends~(~(id~0~name~'Colon*20Salazar)~(id~1~name~'French*20Mcneil)~(id~2~name~'Carol*20Martin))~favoriteFruit~'banana)
QS: _id=5973782bdb9a930533b05cb2&isActive=true&balance=$1,446.35&age=32&name=Logan Keller&email=logankeller@artiq.com&phone=+1 (952) 533-2258&friends[0][id]=0&friends[0][name]=Colon Salazar&friends[1][id]=1&friends[1][name]=French Mcneil&friends[2][id]=2&friends[2][name]=Carol Martin&favoriteFruit=banana
URLON: $_id=5973782bdb9a930533b05cb2&isActive:true&balance=$1,446.35&age:32&name=Logan%20Keller&email=logankeller@artiq.com&phone=+1%20(952)%20533-2258&friends@$id:0&name=Colon%20Salazar;&$id:1&name=French%20Mcneil;&$id:2&name=Carol%20Martin;;&favoriteFruit=banana
QS-JSON: isActive=true&balance=%241%2C446.35&age=32&name=Logan+Keller&email=logankeller%40artiq.com&phone=%2B1+(952)+533-2258&friends(0).id=0&friends(0).name=Colon+Salazar&friends(1).id=1&friends(1).name=French+Mcneil&friends(2).id=2&friends(2).name=Carol+Martin&favoriteFruit=banana
Run Code Online (Sandbox Code Playgroud)
其中最短的是URL 对象表示法。
| 归档时间: |
|
| 查看次数: |
329270 次 |
| 最近记录: |