126 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
 | 
						||
[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)
 | 
						||
 | 
						||
 |