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;
}