50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
|
// based on the qs module, but handles null objects as expected
|
||
|
// fixes by Tomas Pollak.
|
||
|
|
||
|
var toString = Object.prototype.toString;
|
||
|
|
||
|
function stringify(obj, prefix) {
|
||
|
if (prefix && (obj === null || typeof obj == 'undefined')) {
|
||
|
return prefix + '=';
|
||
|
} else if (toString.call(obj) == '[object Array]') {
|
||
|
return stringifyArray(obj, prefix);
|
||
|
} else if (toString.call(obj) == '[object Object]') {
|
||
|
return stringifyObject(obj, prefix);
|
||
|
} else if (toString.call(obj) == '[object Date]') {
|
||
|
return obj.toISOString();
|
||
|
} else if (prefix) { // string inside array or hash
|
||
|
return prefix + '=' + encodeURIComponent(String(obj));
|
||
|
} else if (String(obj).indexOf('=') !== -1) { // string with equal sign
|
||
|
return String(obj);
|
||
|
} else {
|
||
|
throw new TypeError('Cannot build a querystring out of: ' + obj);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function stringifyArray(arr, prefix) {
|
||
|
var ret = [];
|
||
|
|
||
|
for (var i = 0, len = arr.length; i < len; i++) {
|
||
|
if (prefix)
|
||
|
ret.push(stringify(arr[i], prefix + '[]'));
|
||
|
else
|
||
|
ret.push(stringify(arr[i]));
|
||
|
}
|
||
|
|
||
|
return ret.join('&');
|
||
|
}
|
||
|
|
||
|
function stringifyObject(obj, prefix) {
|
||
|
var ret = [];
|
||
|
|
||
|
Object.keys(obj).forEach(function(key) {
|
||
|
ret.push(stringify(obj[key], prefix
|
||
|
? prefix + '[' + encodeURIComponent(key) + ']'
|
||
|
: encodeURIComponent(key)));
|
||
|
})
|
||
|
|
||
|
return ret.join('&');
|
||
|
}
|
||
|
|
||
|
exports.build = stringify;
|