From 56f199bd69e2f20478d7595c4786d4e36dd3b020 Mon Sep 17 00:00:00 2001 From: jdalton Date: Thu, 4 Jun 2015 21:14:26 -0700 Subject: [PATCH] Make `_.sortByOrder` support orders of "asc" and "desc". --- lodash.src.js | 31 ++++++++++++++++--------------- test/test.js | 16 ++++++++++------ 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/lodash.src.js b/lodash.src.js index eef31f708..426fc7a32 100644 --- a/lodash.src.js +++ b/lodash.src.js @@ -416,8 +416,8 @@ * sort them in ascending order. * * @private - * @param {Object} object The object to compare to `other`. - * @param {Object} other The object to compare to `object`. + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. * @returns {number} Returns the sort order indicator for `object`. */ function compareAscending(object, other) { @@ -425,16 +425,16 @@ } /** - * Used by `_.sortByOrder` to compare multiple properties of each element - * in a collection and stable sort them in the following order: + * Used by `_.sortByOrder` to compare multiple properties of a value to another + * and stable sort them. * - * If `orders` is unspecified, sort in ascending order for all properties. - * Otherwise, for each property, sort in ascending order if its corresponding value in - * orders is true, and descending order if false. + * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise, + * a value is sorted in ascending order if its corresponding order is "asc", and + * descending if "desc". * * @private - * @param {Object} object The object to compare to `other`. - * @param {Object} other The object to compare to `object`. + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. * @param {boolean[]} orders The order to sort by for each property. * @returns {number} Returns the sort order indicator for `object`. */ @@ -451,7 +451,8 @@ if (index >= ordersLength) { return result; } - return result * (orders[index] ? 1 : -1); + var order = orders[index]; + return result * ((order === 'asc' || order === true) ? 1 : -1); } } // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications @@ -7263,9 +7264,9 @@ /** * This method is like `_.sortByAll` except that it allows specifying the - * sort orders of the iteratees to sort by. A truthy value in `orders` will - * sort the corresponding property name in ascending order while a falsey - * value will sort it in descending order. + * sort orders of the iteratees to sort by. If `orders` is unspecified, all + * values are sorted in ascending order. Otherwise, a value is sorted in + * ascending order if its corresponding order is "asc", and descending if "desc". * * If a property name is provided for an iteratee the created `_.property` * style callback returns the property value of the given element. @@ -7279,7 +7280,7 @@ * @category Collection * @param {Array|Object|string} collection The collection to iterate over. * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. - * @param {boolean[]} orders The sort orders of `iteratees`. + * @param {boolean[]} [orders] The sort orders of `iteratees`. * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. * @returns {Array} Returns the new sorted array. * @example @@ -7292,7 +7293,7 @@ * ]; * * // sort by `user` in ascending order and by `age` in descending order - * _.map(_.sortByOrder(users, ['user', 'age'], [true, false]), _.values); + * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values); * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] */ function sortByOrder(collection, iteratees, orders, guard) { diff --git a/test/test.js b/test/test.js index fa3f83d42..e384bbe15 100644 --- a/test/test.js +++ b/test/test.js @@ -14525,14 +14525,18 @@ { 'a': 'y', 'b': 2 } ]; - test('should sort multiple properties by specified orders', 1, function() { - var actual = _.sortByOrder(objects, ['a', 'b'], [false, true]); - deepEqual(actual, [objects[3], objects[1], objects[2], objects[0]]); + test('should sort multiple properties by specified orders', 2, function() { + _.each([[false, true], ['desc', 'asc']], function(orders) { + var actual = _.sortByOrder(objects, ['a', 'b'], orders); + deepEqual(actual, [objects[3], objects[1], objects[2], objects[0]]); + }); }); - test('should sort a property in ascending order when its order is not specified', 1, function() { - var actual = _.sortByOrder(objects, ['a', 'b'], [false]); - deepEqual(actual, [objects[3], objects[1], objects[2], objects[0]]); + test('should sort a property in ascending order when its order is not specified', 2, function() { + _.each([[false], ['desc']], function(orders) { + var actual = _.sortByOrder(objects, ['a', 'b'], orders); + deepEqual(actual, [objects[3], objects[1], objects[2], objects[0]]); + }); }); }());