Sort version-dotted number strings in Javascript?

前端 未结 14 1740
栀梦
栀梦 2020-12-05 15:01

I have an array of following strings:

[\'5.5.1\', \'4.21.0\', \'4.22.0\', \'6.1.0\', \'5.1.0\', \'4.5.0\'] 

...etc.

I need a soluti

14条回答
  •  Happy的楠姐
    2020-12-05 15:27

    You could split the strings and compare the parts.

    function customSort(data, order) {
    
      function isNumber(v) {
        return (+v).toString() === v;
      }
    
      var sort = {
        asc: function (a, b) {
          var i = 0,
            l = Math.min(a.value.length, b.value.length);
    
          while (i < l && a.value[i] === b.value[i]) {
            i++;
          }
          if (i === l) {
            return a.value.length - b.value.length;
          }
          if (isNumber(a.value[i]) && isNumber(b.value[i])) {
            return a.value[i] - b.value[i];
          }
          return a.value[i].localeCompare(b.value[i]);
        },
        desc: function (a, b) {
          return sort.asc(b, a);
        }
      }
      var mapped = data.map(function (el, i) {
        return {
          index: i,
          value: el.split('')
        };
      });
    
      mapped.sort(sort[order] || sort.asc);
      return mapped.map(function (el) {
        return data[el.index];
      });
    }
    
    var array = ['5.5.1', '4.21.0', '4.22.0', '6.1.0', '5.1.0'];
    
    console.log('sorted array asc', customSort(array));
    console.log('sorted array desc ', customSort(array, 'desc'));
    console.log('original array ', array);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

提交回复
热议问题