naturalCmp.js 701 B

1234567891011121314151617181920212223242526272829
  1. module.exports = function naturalCmp(str1, str2) {
  2. if (str1 == str2) return 0;
  3. if (!str1) return -1;
  4. if (!str2) return 1;
  5. var cmpRegex = /(\.\d+|\d+|\D+)/g,
  6. tokens1 = String(str1).match(cmpRegex),
  7. tokens2 = String(str2).match(cmpRegex),
  8. count = Math.min(tokens1.length, tokens2.length);
  9. for (var i = 0; i < count; i++) {
  10. var a = tokens1[i],
  11. b = tokens2[i];
  12. if (a !== b) {
  13. var num1 = +a;
  14. var num2 = +b;
  15. if (num1 === num1 && num2 === num2) {
  16. return num1 > num2 ? 1 : -1;
  17. }
  18. return a < b ? -1 : 1;
  19. }
  20. }
  21. if (tokens1.length != tokens2.length)
  22. return tokens1.length - tokens2.length;
  23. return str1 < str2 ? -1 : 1;
  24. };