Guest User

Untitled

a guest
Dec 12th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. function naturalSort(array, extractor) {
  2. var splitters = array.map(makeSplitter);
  3. var sorted = splitters.sort(compareSplitters);
  4. return sorted.map(function(splitter) {
  5. return splitter.item
  6. });
  7. function makeSplitter(item) {
  8. return new Splitter(item)
  9. }
  10. function Splitter(item) {
  11. var index = 0;
  12. var from = 0;
  13. var parts = [];
  14. var completed = false;
  15. this.item = item;
  16. var key = typeof extractor === "function" ? extractor(item) : item;
  17. this.key = key;
  18. this.count = function() {
  19. return parts.length
  20. };
  21. this.part = function(i) {
  22. while(parts.length <= i && !completed) {
  23. next()
  24. }
  25. return i < parts.length ? parts[i] : null
  26. };
  27. function next() {
  28. if(index < key.length) {
  29. while(++index) {
  30. var currentIsDigit = isDigit(key.charAt(index - 1));
  31. var nextChar = key.charAt(index);
  32. var currentIsLast = index === key.length;
  33. var isBorder = currentIsLast || xor(currentIsDigit, isDigit(nextChar));
  34. if(isBorder) {
  35. var partStr = key.slice(from, index);
  36. parts.push(new Part(partStr, currentIsDigit));
  37. from = index;
  38. break
  39. }
  40. }
  41. }else {
  42. completed = true
  43. }
  44. }
  45. function Part(text, isNumber) {
  46. this.isNumber = isNumber;
  47. this.value = isNumber ? Number(text) : text
  48. }
  49. }
  50. function compareSplitters(sp1, sp2) {
  51. var i = 0;
  52. do {
  53. var first = sp1.part(i);
  54. var second = sp2.part(i);
  55. if(null !== first && null !== second) {
  56. if(xor(first.isNumber, second.isNumber)) {
  57. return first.isNumber ? -1 : 1
  58. }else {
  59. var comp = compare(first.value, second.value);
  60. if(comp != 0) {
  61. return comp
  62. }
  63. }
  64. }else {
  65. return compare(sp1.count(), sp2.count())
  66. }
  67. }while(++i);
  68. function compare(a, b) {
  69. return a < b ? -1 : a > b ? 1 : 0
  70. }
  71. }
  72. function xor(a, b) {
  73. return a ? !b : b
  74. }
  75. function isDigit(chr) {
  76. var code = charCode(chr);
  77. return code >= charCode("0") && code <= charCode("9");
  78. function charCode(c) {
  79. return c.charCodeAt(0)
  80. }
  81. }
  82. }
  83. ;
Add Comment
Please, Sign In to add comment