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.
		
		
		
		
			
				
					126 lines
				
				3.3 KiB
			
		
		
			
		
	
	
					126 lines
				
				3.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								[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)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |