Array Natural Sort
by merganser
JavaScript
var names = ["z1", "z100", "z2", "z20"];
console.log("names unsorted", names); // ["z1", "z100", "z2", "z20"]
console.log("names sorted", names.sort()); // ["z1", "z100", "z2", "z20"]
console.log("names natural sorted", names.sort(NaturalSort)); // ["z1", "z2", "z20", "z100"]
function NaturalSort(a, b) {
var ax = [],
bx = [];
a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) {
ax.push([$1 || Infinity, $2 || ""])
});
b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) {
bx.push([$1 || Infinity, $2 || ""])
});
while (ax.length && bx.length) {
var an = ax.shift();
var bn = bx.shift();
var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
if (nn) return nn;
}
return ax.length - bx.length;
}