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%25
这个还可以转换递归对象(使用PHP“array”符号来表示查询字符串):
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=3
var k = prefix ? prefix + '.' + p : p, v = obj[p];
以便模型绑定正常工作!谢谢。 - user1229323只需使用URLSearchParams
。 这在所有现代浏览器中都能正常工作。
new URLSearchParams(object).toString()
URLSearchParams
之前将嵌套对象转换为字符串。 - Mosh FeujQuery有一个函数可以做到这一点,jQuery.param()。如果您已经在使用它,您可以使用以下代码:
示例:
var params = { width:1680, height:1050 };
var str = jQuery.param( params );
str
现在包含width=1680&height=1050
。
var a = [];
a[5] = 'foo';
jQuery.param({ parameters: a });
结果是"parameters[]=¶meters[]=¶meters[]=¶meters[]=¶meters[]=¶meters[]=foo"
。虽然这是正确的,但可能不是你所期望的。 - Chris Hall我建议使用URLSearchParams
接口:
const searchParams = new URLSearchParams();
const params = {foo: "hi there", bar: "100%" };
Object.keys(params).forEach(key => searchParams.append(key, params[key]));
console.log(searchParams.toString())
或者通过将搜索对象传递到构造函数中,像这样:
const params = {foo: "hi there", bar: "100%" };
const queryString = new URLSearchParams(params).toString();
console.log(queryString);
a[1]=test&a[2]=test2
。 - SergkeiMObject.entries
。例如上述代码: const searchParams = new URLSearchParams(Object.entries(params));
- T.J. Crowder.../?orderby=&page=1
。当然,这可以在后端处理,但最好使事情更安全。 - JM217使用:
Object.keys(obj).reduce(function(a,k){a.push(k+'='+encodeURIComponent(obj[k]));return a},[]).join('&')
我喜欢这个单行代码,但如果它在语义上与被接受的答案匹配,那么它可能会更受欢迎:
function serialize( obj ) {
let str = '?' + Object.keys(obj).reduce(function(a, k){
a.push(k + '=' + encodeURIComponent(obj[k]));
return a;
}, []).join('&');
return str;
}
Object.keys(obj).map(k => k + '=' + encodeURIComponent(obj[k])).join('&')
- Jannes MeyerObject.keys
仅在 IE >= 9 中可用。 - JohnstonObject.keys(obj).map(k => `${k}=${encodeURIComponent(obj[k])}`).join('&')
。 - csilk这是ES6中的一行代码:
Object.keys(obj).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`).join('&');
export?actions[]=finance,create,edit
,但实际上应该是 export?actions[]=finance&actions[]=create&actions[]=edit
,这是一个糟糕的标准。 - darkbluesunactions[]
是 PHP 的表示法;Django 使用多个 action
而没有 []
后缀;一些其他的ORM/CMS需要逗号分隔的列表等等。因此,"如果不是简单字符串,请先确保您知道您的服务器需要什么"。 - Mike 'Pomax' KamermansencodeURIComponent()
? - igorsantos07map
之前添加:Object.keys(obj).filter(k => obj[k])
。 - Augustin Riedingerconst querystring = require('querystring')
const obj = {
foo: 'bar',
baz: 'tor'
}
let result = querystring.stringify(obj)
// foo=bar&baz=tor
参考文献:查询字符串
此方法将JavaScript对象转换为URI查询字符串。它还处理嵌套的数组和对象(在Ruby on Rails和PHP语法中):
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('&');
}
使用示例:
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
function
来排除 falsy
值(null、undefined、NaN、''),会很有趣... - developer033对用户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("&");
}
在对象上检查hasOwnProperty可以使JSLint和JSHint感到满意,并且如果对象不是简单字典,则可以防止意外地序列化对象的方法或其他东西。请参见JavaScript编程语言代码约定中关于for语句的段落。
这里有一个一行代码:
const encoded = Object.entries(obj).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join("&");