我需要转换以下类型字典:
{'key1': ['value1'], 'key2': ['value1', 'value2']}
到key1=value1&key2=....
即。发布数据表格。我在chrome扩展中执行此操作,上面的formdata字典由以下字段返回:
chrome.webRequest.onBeforeRequest.addListener(function(details) {
if(details.method=="POST") // ajax call
{
message.postdata = details.requestBody.formData;
}
return {requestHeaders: details.requestHeaders};
}, {urls: ["<all_urls>"],types: ["main_frame", "sub_frame"]}, ["blocking", "requestBody"]);
我记得使用 JQuery $ .params()函数实现同样的目标。怎样才能在javascript中完成。
答案 0 :(得分:9)
function queryParams(source) {
var array = [];
for(var key in source) {
array.push(encodeURIComponent(key) + "=" + encodeURIComponent(source[key]));
}
return array.join("&");
}
答案 1 :(得分:9)
这是mini jquery param API [小提琴]。
您可以通过jqMini.param(obj);
如上面的小提琴所示,它提供相同的 使用jquery的原始$ .param函数输出。
注意:jqMini.param不处理传统的jquery 对象作为参数。
(function(w) {
var app = {},
class2type = {},
toString = class2type.toString,
r20 = /%20/g,
rbracket = /\[\]$/;
w.jqMini = app;
app.type = function(obj) {
if ( obj == null ) {
return obj + "";
}
// Support: Android < 4.0, iOS < 6 (functionish RegExp)
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call(obj) ] || "object" :
typeof obj;
};
app.isFunction = function(obj) {
return app.type(obj) === "function";
};
app.buildParams = function(prefix, obj, add) {
var name, key, value;
if(Array.isArray(obj)) {
for(var key in obj) {
value = obj[key]
if(rbracket.test(prefix))
add(prefix, value);
else
app.buildParams(prefix + "[" + (typeof v === "object"? i: "") + "]", value, add );
}
} else if(app.type(obj) === 'object') {
for(name in obj)
app.buildParams(prefix + "[" + name + "]", obj[name], add);
} else
add(prefix, obj);
};
app.param = function(obj) {
var prefix, key, value
serialized = [],
add = function(key, value) {
value = app.isFunction(value)? value() : (value == null ? "" : value );
serialized[serialized.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
};
if(Array.isArray(obj)) {
for(key in obj) {
value = obj[key];
add(key, value);
}
} else {
for(prefix in obj)
app.buildParams(prefix, obj[prefix], add);
}
return serialized.join('&').replace(r20, '+');
};
})(window);
var obj = {'key1': ['value1'], 'key2': ['value1', 'value2']};
console.log(jqMini.param(obj));
&#13;
答案 2 :(得分:2)
对于那些使用AngularJS的人,您可能需要查看$httpParamSerializerJQLike
答案 3 :(得分:1)
这就是我想出的 - 它与jQuery param具有相同的数组处理。
var queryParam = function( ary ) {
return Object.keys( ary ).map( function( key ) {
if ( Array.isArray( ary[key] ) ) {
var arrayParts = [];
for ( var i = 0; i< ary[key].length; i++ ) {
arrayParts.push( encodeURIComponent( key + '[]' ) + '=' + encodeURIComponent( ary[key][i] ) );
}
return arrayParts.join( '&' );
}
return encodeURIComponent( key ) + '=' + encodeURIComponent( ary[key] );
}).join('&');
};
答案 4 :(得分:0)
尝试一下:
const data = {'key1': ['value1'], 'key2': ['value1', 'value2']};
const p = new URLSearchParams();
Object.keys(data).map((k) => data[k].map((v) => p.append(k+"[]",v)));
console.log(p.toString());
输出:key1%5B%5D = value1&key2%5B%5D = value1&key2%5B%5D = value2