You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.3 KiB
125 lines
3.3 KiB
|
|
[Build]: http://img.shields.io/travis/litejs/natural-compare-lite.png |
|
[Coverage]: http://img.shields.io/coveralls/litejs/natural-compare-lite.png |
|
[1]: https://travis-ci.org/litejs/natural-compare-lite |
|
[2]: https://coveralls.io/r/litejs/natural-compare-lite |
|
[npm package]: https://npmjs.org/package/natural-compare-lite |
|
[GitHub repo]: https://github.com/litejs/natural-compare-lite |
|
|
|
|
|
|
|
@version 1.4.0 |
|
@date 2015-10-26 |
|
@stability 3 - Stable |
|
|
|
|
|
Natural Compare – [![Build][]][1] [![Coverage][]][2] |
|
=============== |
|
|
|
Compare strings containing a mix of letters and numbers |
|
in the way a human being would in sort order. |
|
This is described as a "natural ordering". |
|
|
|
```text |
|
Standard sorting: Natural order sorting: |
|
img1.png img1.png |
|
img10.png img2.png |
|
img12.png img10.png |
|
img2.png img12.png |
|
``` |
|
|
|
String.naturalCompare returns a number indicating |
|
whether a reference string comes before or after or is the same |
|
as the given string in sort order. |
|
Use it with builtin sort() function. |
|
|
|
|
|
|
|
### Installation |
|
|
|
- In browser |
|
|
|
```html |
|
<script src=min.natural-compare.js></script> |
|
``` |
|
|
|
- In node.js: `npm install natural-compare-lite` |
|
|
|
```javascript |
|
require("natural-compare-lite") |
|
``` |
|
|
|
### Usage |
|
|
|
```javascript |
|
// Simple case sensitive example |
|
var a = ["z1.doc", "z10.doc", "z17.doc", "z2.doc", "z23.doc", "z3.doc"]; |
|
a.sort(String.naturalCompare); |
|
// ["z1.doc", "z2.doc", "z3.doc", "z10.doc", "z17.doc", "z23.doc"] |
|
|
|
// Use wrapper function for case insensitivity |
|
a.sort(function(a, b){ |
|
return String.naturalCompare(a.toLowerCase(), b.toLowerCase()); |
|
}) |
|
|
|
// In most cases we want to sort an array of objects |
|
var a = [ {"street":"350 5th Ave", "room":"A-1021"} |
|
, {"street":"350 5th Ave", "room":"A-21046-b"} ]; |
|
|
|
// sort by street, then by room |
|
a.sort(function(a, b){ |
|
return String.naturalCompare(a.street, b.street) || String.naturalCompare(a.room, b.room); |
|
}) |
|
|
|
// When text transformation is needed (eg toLowerCase()), |
|
// it is best for performance to keep |
|
// transformed key in that object. |
|
// There are no need to do text transformation |
|
// on each comparision when sorting. |
|
var a = [ {"make":"Audi", "model":"A6"} |
|
, {"make":"Kia", "model":"Rio"} ]; |
|
|
|
// sort by make, then by model |
|
a.map(function(car){ |
|
car.sort_key = (car.make + " " + car.model).toLowerCase(); |
|
}) |
|
a.sort(function(a, b){ |
|
return String.naturalCompare(a.sort_key, b.sort_key); |
|
}) |
|
``` |
|
|
|
- Works well with dates in ISO format eg "Rev 2012-07-26.doc". |
|
|
|
|
|
### Custom alphabet |
|
|
|
It is possible to configure a custom alphabet |
|
to achieve a desired order. |
|
|
|
```javascript |
|
// Estonian alphabet |
|
String.alphabet = "ABDEFGHIJKLMNOPRSŠZŽTUVÕÄÖÜXYabdefghijklmnoprsšzžtuvõäöüxy" |
|
["t", "z", "x", "õ"].sort(String.naturalCompare) |
|
// ["z", "t", "õ", "x"] |
|
|
|
// Russian alphabet |
|
String.alphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя" |
|
["Ё", "А", "Б"].sort(String.naturalCompare) |
|
// ["А", "Б", "Ё"] |
|
``` |
|
|
|
|
|
External links |
|
-------------- |
|
|
|
- [GitHub repo][https://github.com/litejs/natural-compare-lite] |
|
- [jsperf test](http://jsperf.com/natural-sort-2/12) |
|
|
|
|
|
Licence |
|
------- |
|
|
|
Copyright (c) 2012-2015 Lauri Rooden <lauri@rooden.ee> |
|
[The MIT License](http://lauri.rooden.ee/mit-license.txt) |
|
|
|
|
|
|