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".
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
<scriptsrc=min.natural-compare.js></script>
In node.js: npm install natural-compare-lite
require("natural-compare-lite")
Usage
// Simple case sensitive examplevar 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 insensitivitya.sort(function(a, b){returnString.naturalCompare(a.toLowerCase(),b.toLowerCase());})// In most cases we want to sort an array of objectsvar a = [ {"street":"350 5th Ave","room":"A-1021"}, {"street":"350 5th Ave","room":"A-21046-b"} ];// sort by street, then by rooma.sort(function(a, b){returnString.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 modela.map(function(car){car.sort_key = (car.make +" "+car.model).toLowerCase();})a.sort(function(a, b){returnString.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.