【问题标题】:Sorting 'numbers' with multiple decimal points使用多个小数点对“数字”进行排序
【发布时间】:2014-07-15 04:33:31
【问题描述】:

我有一堆有多个小数点的“数字”(所以它们实际上是字符串)。但是,我想像数字一样对它们进行排序。

1.1.1
10.2.3
2.6.7
21.10.4
3.10.12
4.11.5
4.1.16
6.4.23

我希望它们按第一组数字(在第一个小数点之前)排序,然后按第二组,然后按第三组(有可能继续第四组或更多)。他们应该按这个顺序去:

1.1.1
2.6.7
3.10.12
4.1.16
4.11.5
6.4.23
10.2.3
21.10.4

使用 JS 的最佳方法是什么?我想我可能需要将每个数字分成一个数组,但也许有更好的方法。想法?

【问题讨论】:

  • 将每个数字拆分为一个数组并对每个集合进行排序,同时跟踪与其拆分数组关联的每个字符串。可能会很有趣。 12
  • 已更新以处理任意数量的点:stackoverflow.com/a/20080885/1636522

标签: javascript sorting decimal-point


【解决方案1】:

我认为这样的事情应该可以解决问题:

nums.sort(function(a, b) {
    var nums1 = a.split(".");
    var nums2 = b.split(".");

    for (var i = 0; i < nums1.length; i++) {
        if (nums2[i]) { // assuming 5..2 is invalid
            if (nums1[i] !== nums2[i]) {
               return nums1[i] - nums2[i];   
            } // else continue
        } else {
            return 1; // no second number in b
        }
    }
    return -1; // was missing case b.len > a.len
});

更新heres a fiddle

var nums = ['1.1.1', '2.6.7.3.2', '2.6.7', '2.6.7.3', '2.6.7.1', '6.4.23', '2.7']

这样排序 => ['1.1.1','2.6.7.1','2.6.7.3.2','2.6.7','2.6.7.3','2.7','6.4.23']

【讨论】:

    【解决方案2】:

    为了取悦megawac :D

    list.sort(function (a, b) {
        var result;
        a = a.split('.');
        b = b.split('.');
        while (a.length) {
            if (result = a.shift() - (b.shift() || 0)) {
                return result;
            }
        }
        return -b.length;
    });
    

    处理任意数量的点:

    input  ['1.3', '10', '1.2', '2', '1.1.2', '1.1.1', '1.1']
    output ['1.1', '1.1.1', '1.1.2', '1.2', '1.3', '2', '10']
    

    【讨论】:

      【解决方案3】:

      试试这个:

      var list = ['1.1.1', '10.2.3', '2.6.7', '21.10.4', '3.10.12', '4.11.5', '4.1.16', '6.4.23'];
      
      list.sort(function (a, b) {
          a = a.split('.');
          b = b.split('.');
          return (
              a.shift() - b.shift()
          ) || (
              a.shift() - b.shift()
          ) || (
              a.shift() - b.shift()
          );
      });
      

      【讨论】:

      • 如果您使用while 循环在此处移动,您可以处理n 的小数位数
      • @megawac 我知道,我只是懒得创建一个变量来处理减法的结果:D
      【解决方案4】:

      我通过将每个数字拆分为一个数组,然后使用自定义排序方法执行多维排序来解决此问题。这是我得到的:

      function multiDecimalSort(input) {
          var output,
              i,
              len;
      
          output = [];
      
          // Unglue decimal parts
          for (i = 0, len = input.length; i < len; i++) {
              output.push(input[i].split('.'));
          }
      
          // Apply custom sort
          output.sort(function (a, b) {
              for (i = 0, len = a.length; i < len; i++) {
                  // cast decimal part to int
                  a[i] = parseInt(a[i], 10);
                  b[i] = parseInt(b[i], 10);
      
                  if (a[i] !== b[i]) {
                      return a[i] - b[i];
                  }
              }
          });
      
          // Rejoin decimal parts
          for (i = 0, len = input.length; i < len; i++) {
              output[i] = output[i].join(".");
          }
      
          return output;
      }
      

      【讨论】:

      • 啊,看看@wared 的解决方案……伙计,就是这样。
      猜你喜欢
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多