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) | |||
|  | 
 | |||
|  | 
 |