natural-compare-lite

Compare strings containing a mix of letters and numbers in the way a human being would in sort order.

@version    1.3.0
@date       2014-11-29
@stability  3 - Stable

Natural Compare –

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.

  • In browser
<script src=min.natural-compare.js></script>
  • In node.js: npm install natural-compare-lite
require("natural-compare-lite")
// 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(ab){
  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(ab){
  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(ab){
  return String.naturalCompare(a.sort_key, b.sort_key);
})
  • Works well with dates in ISO format eg "Rev 2012-07-26.doc".

It is possible to configure a custom alphabet to achieve a desired order.

// 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)
// ["А", "Б", "Ё"] 

Copyright (c) 2012, 2014 Lauri Rooden <lauri@rooden.ee>
The MIT License