For your delectation and amusement in this new year: the shortest (and possibly slowest…) natural-order sorting method I could come up with:
Array.prototype.naturalSort = function() {
var p, q, valueOf = function(t) {
return isNaN(t) ? t.charCodeAt(0) :
Number(t) - Math.pow(2,32);
};
return this.sort(function(a,b) {
var values = [a,b].map(function(s) {
return s.toString().toLowerCase()
.match(/([a-z]|[0-9]+(?:\.[0-9]+)?)/ig);
});
a = values[0]; b = values[1];
for (var i = 0, n = Math.min(a.length, b.length); i < n; i++) {
p = valueOf(a[i]), q = valueOf(b[i]);
if (p != q) return p - q;
}
return a.length - b.length;
});
};
I don’t know why, I just had to do this after finding a JS implementation via this article last year which was large, buggy, and littered with global variables…
Please don’t use this, it really is slow. Just an exercise in seeing how short a method I could write.