[removed] natural sort of alphanumerical strings

后端 未结 7 1472
抹茶落季
抹茶落季 2020-11-21 10:19

I\'m looking for the easiest way to sort an array that consists of numbers and text, and a combination of these.

E.g.

\'123asd\'
\'19asd\'
\'12345asd\'         


        
7条回答
  •  梦如初夏
    2020-11-21 10:34

    Building on @Adrien Be's answer above and using the code that Brian Huisman & David koelle created, here is a modified prototype sorting for an array of objects:

    //Usage: unsortedArrayOfObjects.alphaNumObjectSort("name");
    //Test Case: var unsortedArrayOfObjects = [{name: "a1"}, {name: "a2"}, {name: "a3"}, {name: "a10"}, {name: "a5"}, {name: "a13"}, {name: "a20"}, {name: "a8"}, {name: "8b7uaf5q11"}];
    //Sorted: [{name: "8b7uaf5q11"}, {name: "a1"}, {name: "a2"}, {name: "a3"}, {name: "a5"}, {name: "a8"}, {name: "a10"}, {name: "a13"}, {name: "a20"}]
    
    // **Sorts in place**
    Array.prototype.alphaNumObjectSort = function(attribute, caseInsensitive) {
      for (var z = 0, t; t = this[z]; z++) {
        this[z].sortArray = new Array();
        var x = 0, y = -1, n = 0, i, j;
    
        while (i = (j = t[attribute].charAt(x++)).charCodeAt(0)) {
          var m = (i == 46 || (i >=48 && i <= 57));
          if (m !== n) {
            this[z].sortArray[++y] = "";
            n = m;
          }
          this[z].sortArray[y] += j;
        }
      }
    
      this.sort(function(a, b) {
        for (var x = 0, aa, bb; (aa = a.sortArray[x]) && (bb = b.sortArray[x]); x++) {
          if (caseInsensitive) {
            aa = aa.toLowerCase();
            bb = bb.toLowerCase();
          }
          if (aa !== bb) {
            var c = Number(aa), d = Number(bb);
            if (c == aa && d == bb) {
              return c - d;
            } else {
              return (aa > bb) ? 1 : -1;
            }
          }
        }
    
        return a.sortArray.length - b.sortArray.length;
      });
    
      for (var z = 0; z < this.length; z++) {
        // Here we're deleting the unused "sortArray" instead of joining the string parts
        delete this[z]["sortArray"];
      }
    }
    

提交回复
热议问题