Skip to content

Commit

Permalink
Add an option to sort the keys in the query string FIX #64
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexandre Stanislawski committed Sep 30, 2015
1 parent 27ac28f commit 4b434ed
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
18 changes: 15 additions & 3 deletions lib/stringify.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ var internals = {
};


internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter) {
internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort) {

if (typeof filter === 'function') {
obj = filter(prefix, obj);
Expand Down Expand Up @@ -62,7 +62,14 @@ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHand
return values;
}

var objKeys = Array.isArray(filter) ? filter : Object.keys(obj);
var objKeys;
if (Array.isArray(filter)) {
objKeys = filter;
} else {
var keys = Object.keys(obj);
objKeys = sort ? keys.sort(sort) : keys;
}

for (var i = 0, il = objKeys.length; i < il; ++i) {
var key = objKeys[i];

Expand Down Expand Up @@ -91,6 +98,7 @@ module.exports = function (obj, options) {
var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : internals.skipNulls;
var encode = typeof options.encode === 'boolean' ? options.encode : internals.encode;
var sort = typeof options.sort === 'function' ? options.sort : null;
var objKeys;
var filter;
if (typeof options.filter === 'function') {
Expand Down Expand Up @@ -126,6 +134,10 @@ module.exports = function (obj, options) {
objKeys = Object.keys(obj);
}

if (sort) {
objKeys.sort(sort);
}

for (var i = 0, il = objKeys.length; i < il; ++i) {
var key = objKeys[i];

Expand All @@ -135,7 +147,7 @@ module.exports = function (obj, options) {
continue;
}

keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort));
}

return keys.join(delimiter);
Expand Down
12 changes: 12 additions & 0 deletions test/stringify.js
Original file line number Diff line number Diff line change
Expand Up @@ -278,4 +278,16 @@ describe('stringify()', function () {
expect(Qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false })).to.equal('a=b&c');
done();
});

it('can sort the keys', function (done) {

var sort = function alphabeticalSort (a, b) {

return a.localeCompare(b);
};

expect(Qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort : sort })).to.equal('a=c&b=f&z=y');
expect(Qs.stringify({ a: 'c', z: { j: 'a', i:'b' }, b : 'f' }, { sort : sort })).to.equal('a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a');
done();
});
});

0 comments on commit 4b434ed

Please sign in to comment.