diff --git a/.internal/baseOrderBy.js b/.internal/baseOrderBy.js index 4d78275655..7a5308224b 100644 --- a/.internal/baseOrderBy.js +++ b/.internal/baseOrderBy.js @@ -1,8 +1,12 @@ import baseEach from './baseEach.js' import baseSortBy from './baseSortBy.js' +import baseGet from './baseGet.js' import compareMultiple from './compareMultiple.js' import isArrayLike from '../isArrayLike.js' +// As existing identity function is in ../test/utils.js, so defining it here, it can be moved to utils +const identity = value => value; + /** * The base implementation of `orderBy` without param guards. * @@ -15,7 +19,12 @@ import isArrayLike from '../isArrayLike.js' function baseOrderBy(collection, iteratees, orders) { let criteriaIndex = -1 let eachIndex = -1 - iteratees = iteratees.length ? iteratees : [(value) => value] + iteratees = iteratees.length ? iteratees.map((iteratee) => { + if (Array.isArray(iteratee)) { + return (value) => baseGet(value, iteratee) + } + return iteratee + }) : [identity] const result = isArrayLike(collection) ? new Array(collection.length) : [] diff --git a/test/orderBy.js b/test/orderBy.js index 51f591812e..22aa4755c4 100644 --- a/test/orderBy.js +++ b/test/orderBy.js @@ -11,11 +11,29 @@ describe('orderBy', function() { { 'a': 'y', 'b': 2 } ]; + var nestedObj = [ + { id: '4', address: { zipCode: 4, streetName: 'Beta' } }, + { id: '3', address: { zipCode: 3, streetName: 'Alpha' } }, + { id: '1', address: { zipCode: 1, streetName: 'Alpha' } }, + { id: '2', address: { zipCode: 2, streetName: 'Alpha' } }, + { id: '5', address: { zipCode: 4, streetName: 'Alpha' } }, + ]; + + it('should sort by a single property by a specified order', function() { var actual = orderBy(objects, 'a', 'desc'); assert.deepStrictEqual(actual, [objects[1], objects[3], objects[0], objects[2]]); }); + it('should sort by nested key in array format', () => { + var actual = orderBy( + nestedObj, + [['address','zipCode'], ['address.streetName']], + ['asc', 'desc'], + ); + assert.deepStrictEqual(actual, [nestedObj[2], nestedObj[3], nestedObj[0], nestedObj[1]], nestedObj[4]); + }); + it('should sort by multiple properties by specified orders', function() { var actual = orderBy(objects, ['a', 'b'], ['desc', 'asc']); assert.deepStrictEqual(actual, [objects[3], objects[1], objects[2], objects[0]]);