https://github.com/jherax/array-sort-by
Powerful mechanism to sort arrays or array of objects by one or more properties. You can also specify a custom comparer function.
https://github.com/jherax/array-sort-by
accent amd arrange array asc commonjs compare desc javascript objects ordering requirejs sort sort-criteria umd-modules
Last synced: 6 months ago
JSON representation
Powerful mechanism to sort arrays or array of objects by one or more properties. You can also specify a custom comparer function.
- Host: GitHub
- URL: https://github.com/jherax/array-sort-by
- Owner: jherax
- License: isc
- Created: 2016-10-21T00:51:10.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2018-09-19T14:50:48.000Z (over 7 years ago)
- Last Synced: 2025-04-03T12:35:35.071Z (10 months ago)
- Topics: accent, amd, arrange, array, asc, commonjs, compare, desc, javascript, objects, ordering, requirejs, sort, sort-criteria, umd-modules
- Language: JavaScript
- Homepage:
- Size: 254 KB
- Stars: 39
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Array sortBy
Powerful mechanism to sort arrays or array of objects by one or more properties.
You can also specify a custom comparer function.
By default it has support for some accented characters
(see [`mapAccents`](#mapaccents)).
## Content
1. [Getting started](#getting-started)
1. [Including the library](#including-the-library)
1. [Examples](#examples)
## Getting started
To include this library into your package manager with `npm` or `yarn`
```shell
# with npm
$ npm install array-sort-by
# with yarn
$ yarn add array-sort-by
```
The `sortBy` function has the following signature:
```javascript
/**
* @param {Array} array: the list of elements to sort
* @param {Function} parser: transforms each item and specifies the sorting mode
* @return {Array}
*/
sortBy(array: Array) : Array
sortBy(array: Array, parser: Function) : Array
```
If the parameter `parser` is not provided, then the array is sorted using
the default implementation of `Array.prototype.sort()`.
Otherwise, the parameter `parser` is a function that transforms each element
being iterated and sets the sorting rules: _ascending_ or _descending_.
Here you can specify the way of sorting by multiple properties.
The `parser` callback has the following signature:
```javascript
/**
* @param {Any} item: the element being iterated over the list
* @param {Number} index: the index of the element in the list
* @return {Any}
*/
parser(item: Any, index: Number) : Any
parser(item: Any) : Any
```
See examples in the section [Examples](#examples)
### mapAccents
A new static method `mapAccents` has been added to the `sortBy` function.
This method allows to register a map of accented characters in order to
sort the string accordingly.
Signature:
```javascript
/**
* @param {String} accents: a string with accented characters
* @param {String} replacements: a string with the replacement for each accent
*/
sortBy.mapAccents(accents: String, replacements: String) : void
```
> **Problem solved**: when you try to order strings with non ASCII characters
like this: `['é', 'a', 'ú', 'c']`, you will obtain strange results after sorting
the array: `['c', 'e', 'á', 'ú']`. That happens because by default the method
`Array.prototype.sort()` does not work correctly with accented characters.
But the static method `mapAccents` comes to the rescue, because it has an
internal mapping with some accented characters and their replacements:
```javascript
// accents
"ÂâÀàÁáÄäÃãÅåÊêÈèÉéËëÎîÌìÍíÏïÔôÒòÓóÖöÕõÛûÙùÚúÜüÑñÝýÿ",
"AaAaAaAaAaAaEeEeEeEeIiIiIiIiOoOoOoOoOoUuUuUuUuNnYyy"
// replacements
```
You also may extend the accented characters and register a new set of special
characters with their respective replacements:
```javascript
// register special characters
sortBy.mapAccents(
'ª@$',
'aas',
);
const arr = ['$impson', 'Cªl@bazä', 'M@ría', 'Cal@bªzA'];
sortBy(arr);
/**
* expected:
* ["Cªl@bazä", "Cal@bªzA", "M@ría", "$impson"]
*
* translated as:
* ["CALABAZA", "CALABAZA", "MARIA", "SIMPSON"]
*/
sortBy(arr, item => `DESC:${item}`);
/**
* expected:
* ["$impson", "M@ría", "Cal@bªzA", "Cªl@bazä"]
*
* translated as:
* ["SIMPSON", "MARIA", "CALABAZA", "CALABAZA"]
*/
```
In the example above, after calling `sortBy.mapAccents()` we extended
the internal mapping, by adding the new accents and their replacements
at the beginning of the mapping, honoring the user mapping first:
```javascript
// accents: added "ª@$"
"ª@$ÂâÀàÁáÄäÃãÅåÊêÈèÉéËëÎîÌìÍíÏïÔôÒòÓóÖöÕõÛûÙùÚúÜüÑñÝýÿ"
"aasAaAaAaAaAaAaEeEeEeEeIiIiIiIiOoOoOoOoOoUuUuUuUuNnYyy"
// replacements
```
[☗ Back to Index](#content)
## Including the library
`array-sort-by` can be included directly from a CDN in your site:
```html
```
In the above case, the function [`sortBy`](#examples) is included as
global object in the browser.
As `sortBy` is built as [UMD] _(Universal Module Definition)_, it can
be included from module loaders such as [CommonJS], [ES2015 Imports]
or [AMD RequireJS].
### CommonJS
```javascript
var sortBy = require('array-sort-by');
```
### ES2015 Imports
```javascript
import sortBy from 'array-sort-by';
```
### AMD
```javascript
// using RequireJS
requirejs.config({
paths: {
// remove the extension .js
'array-sort-by': '/sort-by.min'
}
});
require(['array-sort-by'], function(sortBy) {
sortBy(someArray);
});
```
See an example with RequireJS here: http://jsfiddle.net/FdKTn/75/
[☗ Back to Index](#content)
## Examples
### Default sorting (ASC)
```javascript
let arr = [10, 8, 5, 3, 0, 7, 4, 5, 1];
sortBy(arr);
/**
* expected:
* [0, 1, 3, 4, 5, 5, 7, 8, 10]
*/
```
### Sorting DESC: numbers
```javascript
let arr = [5, 1, 8, 0, 3, 7, 10, 4, 3, 8];
sortBy(arr, n => -n);
/**
* expected:
* [10, 8, 8, 7, 5, 4, 3, 3, 1, 0]
*/
```
### Sorting DESC: date-strings as Date
```javascript
let arr = ['1983/03/06', '1980/12/24', '1985/08/31', '1983/03/05'];
sortBy(arr, (s) => -new Date(s));
/**
* expected:
* ["1985/08/31", "1983/03/06", "1983/03/05", "1980/12/24"]
*/
```
### Sorting DESC: strings
Because we use the minus **(-)** symbol to specify a descending order,
it would produce a `NaN` value if used with a `String` value.
So the flag **`"desc:"`** (not case sensitive) is prefixed
to the string value in the `parser` callback.
```javascript
var arr = ['único', 'cosas', 'Árbol', 'fútbol', 'algo'];
sortBy(arr, item => 'desc:' + item);
/**
* expected:
* ["único", "fútbol", "cosas", "Árbol", "algo"]
*/
// sorting ASC: accented words
sortBy(arr);
/**
* expected:
* ["algo", "Árbol", "cosas", "fútbol", "único"]
*/
```
### Sorting ASC: accented words by @text
```javascript
var arr = [
{ id: 10, text: 'Woche' },
{ id: 20, text: 'wöchentlich' },
{ id: 30, text: 'wäre' }
];
sortBy(arr, item => item.text);
/**
* expected:
* [
* { id: 30, text: "wäre" },
* { id: 10, text: "Woche" },
* { id: 20, text: "wöchentlich" }
* ]
*/
```
### Sorting DESC by @id, after ASC by @dob (as Date)
```javascript
let arr = [
{ id: 8, dob: '1985/08/31' },
{ id: 2, dob: '1980/12/24' },
{ id: 5, dob: '1983/03/06' },
{ id: 8, dob: '1983/03/06' }
];
sortBy(arr, (o) => [-o.id, new Date(o.dob)]);
/**
* expected:
* [
* { id: 8, dob: "1983/03/06" },
* { id: 8, dob: "1985/08/31" },
* { id: 5, dob: "1983/03/06" },
* { id: 2, dob: "1980/12/24" }
* ]
*/
```
### Sorting DESC by @name
```javascript
let arr = [
{ id: 4, name: 'Pedro' },
{ id: 6, name: 'Lucía' },
{ id: 7, name: 'paco' },
{ id: 3, name: 'luis' }
];
sortBy(arr, item => `DESC:${item.name}`);
/**
* expected:
* [
* { id: 4, name: "Pedro" },
* { id: 7, name: "paco" },
* { id: 3, name: "luis" },
* { id: 6, name: "Lucía" }
* ]
*/
```
### Sorting ASC by @name, after DESC by @age, after ASC by @id
```javascript
let arr = [
{ id: 9, age: 26, name: 'pedro' },
{ id: 6, age: 21, name: 'Pedro' },
{ id: 7, age: 26, name: 'Maria' },
{ id: 2, age: 26, name: 'maría' }
];
sortBy(arr, item => [item.name, -item.age, item.id]);
/**
* expected:
* [
* { id: 2, age: 26, name: "maría" },
* { id: 7, age: 26, name: "Maria" },
* { id: 9, age: 26, name: "pedro" },
* { id: 6, age: 21, name: "Pedro" }
* ]
*/
```
[☗ Back to Index](#content)
## Versioning
This projects adopts the [Semantic Versioning](http://semver.org/)
(SemVer) guidelines:
```text
..
```
Given a version number MAJOR.MINOR.PATCH, increment the:
1. MAJOR version when you make incompatible API changes.
1. MINOR version when you add functionality in a backwards-compatible manner.
1. PATCH version when you make backwards-compatible bug fixes.
## Issues
To report an issue and keep traceability of bug-fixes, please report to:
- https://github.com/jherax/array-sort-by/issues
## License
This project has been released under the [ISC](https://opensource.org/licenses/ISC) license.
This license applies ONLY to the source of this repository and does not extend to any other distribution,
or any other 3rd party libraries used in a repository. See [LICENSE](LICENSE) file for more information.
[UMD]: http://davidbcalhoun.com/2014/what-is-amd-commonjs-and-umd/
[CommonJS]: https://blog.risingstack.com/node-js-at-scale-module-system-commonjs-require/
[ES2015 Imports]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
[AMD RequireJS]: http://requirejs.org/docs/api.html#jsfiles