123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*!
- * array-sort <https://github.com/jonschlinkert/array-sort>
- *
- * Copyright (c) 2015-2017, Jon Schlinkert.
- * Released under the MIT License.
- */
- 'use strict';
- var defaultCompare = require('default-compare');
- var typeOf = require('kind-of');
- var get = require('get-value');
- /**
- * Sort an array of objects by one or more properties.
- *
- * @param {Array} `arr` The Array to sort.
- * @param {String|Array|Function} `props` One or more object paths or comparison functions.
- * @param {Object} `opts` Pass `{ reverse: true }` to reverse the sort order.
- * @return {Array} Returns a sorted array.
- * @api public
- */
- function arraySort(arr, props, opts) {
- if (arr == null) {
- return [];
- }
- if (!Array.isArray(arr)) {
- throw new TypeError('array-sort expects an array.');
- }
- if (arguments.length === 1) {
- return arr.sort();
- }
- var args = flatten([].slice.call(arguments, 1));
- // if the last argument appears to be a plain object,
- // it's not a valid `compare` arg, so it must be options.
- if (typeOf(args[args.length - 1]) === 'object') {
- opts = args.pop();
- }
- return arr.sort(sortBy(args, opts));
- }
- /**
- * Iterate over each comparison property or function until `1` or `-1`
- * is returned.
- *
- * @param {String|Array|Function} `props` One or more object paths or comparison functions.
- * @param {Object} `opts` Pass `{ reverse: true }` to reverse the sort order.
- * @return {Array}
- */
- function sortBy(props, opts) {
- opts = opts || {};
- return function compareFn(a, b) {
- var len = props.length, i = -1;
- var result;
- while (++i < len) {
- result = compare(props[i], a, b);
- if (result !== 0) {
- break;
- }
- }
- if (opts.reverse === true) {
- return result * -1;
- }
- return result;
- };
- }
- /**
- * Compare `a` to `b`. If an object `prop` is passed, then
- * `a[prop]` is compared to `b[prop]`
- */
- function compare(prop, a, b) {
- if (typeof prop === 'function') {
- // expose `compare` to custom function
- return prop(a, b, compare.bind(null, null));
- }
- // compare object values
- if (prop && typeof a === 'object' && typeof b === 'object') {
- return compare(null, get(a, prop), get(b, prop));
- }
- return defaultCompare(a, b);
- }
- /**
- * Flatten the given array.
- */
- function flatten(arr) {
- return [].concat.apply([], arr);
- }
- /**
- * Expose `arraySort`
- */
- module.exports = arraySort;
|