排序版本号存储为数组中的字符串

时间:2017-07-17 06:41:25

标签: javascript arrays performance sorting

说我有这样一个数组:

var arr = ["1.2.5", "1", "10", "2.0.4", "3.3.3.3"];


什么是对此进行排序并获得如下结果的最佳方式:

var arr = ["1", "1.2.5", "2.0.4", "3.3.3.3", "10"];

首先我认为将数组中的每个项目转换为浮点数可能会有效,但是多个小数点不会产生预期的结果。

我也可以进行for循环并执行item.split(".")之类的操作,然后逐个检查,但我不认为这是最好的方法。

5 个答案:

答案 0 :(得分:6)

您可以将String#localeCompareoptions

一起使用
  

<强>灵敏度

     

字符串中的哪些差异应导致非零结果值。可能的值有:

     
      
  • "base":只有基本字母不同的字符串才会比较为不相等。示例:a ≠ ba = áa = A
  •   
  • "accent":只有基本字母或重音符号和其他变音符号不同的字符串才会比较为不相等。示例:a ≠ ba ≠ áa = A
  •   
  • "case":只有基本字母或大小写不同的字符串才会比较为不相等。示例:a ≠ ba = áa ≠ A
  •   
  • "variant":基本字母,重音符号和其他变音符号不同的字符串,或不相等的大小写比较。其他差异也可以考虑在内。示例:a ≠ ba ≠ áa ≠ A
  •   
     

默认为&#34;变体&#34;用法&#34;排序&#34 ;;它的区域设置取决于使用情况&#34;搜索&#34;。

     

<强>数字

     

是否应该使用数字校对,以便&#34; 1&#34; &LT; &#34; 2&#34; &LT; &#34; 10&#34 ;.可能的值为truefalse;默认值为false。可以通过options属性或Unicode扩展键设置此选项;如果两者都提供,则options属性优先。实现不需要支持此属性。

&#13;
&#13;
var array = ["1.2.5", "1", "10", "2.0.4", "3.3.3.3"];

array.sort(function (a,b) {
    return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
});

console.log(array);
&#13;
&#13;
&#13;

答案 1 :(得分:4)

function compare(a, b) {
    var aSplit = a.split(".");
    var bSplit = b.split(".");


    var length = Math.min(aSplit.length, bSplit.length);
    for (var i = 0; i < length; ++i) {
        if (parseInt(aSplit[i]) < parseInt(bSplit[i])) {
            return -1;
        } else if (parseInt(aSplit[i]) > parseInt(bSplit[i])) {
            return 1;
        }
    }

    if (aSplit.length < bSplit.length) {
        return -1;
    } else if (aSplit.length > bSplit.length) {
        return 1;
    }

    return 0;
}

您可以使用它:arr.sort((a,b)=&gt; compare(a,b));

答案 2 :(得分:1)

这是我的解决方案(使用ES6语法)

const arr = ["1.2.5", "1", "10", "2.0.4", "3.3.3.3"];

const result = arr
.map((n) => n.split('.').map((c) => c.padStart(10, '0')).join('.'))
.sort()
.map((n) => n.split('.').map((c) => +c).join('.'))

console.log(result);

答案 3 :(得分:0)

var arr = [&#34; 1.2.5&#34;,&#34; 1&#34;,&#34; 10&#34;,&#34; 2.0.4&#34;,&#34 ; 3.3.3.3&#34;];

&#13;
&#13;
var arr = ["1.2.5", "1", "10", "2.0.4", "3.3.3.3"];
console.log(arr.sort(function(a,b){

  var arr1 = a.split('.');
  var arr2 = b.split('.');
  
  var maxlen = Math.max(arr1.length,arr2.length);
  
  var i;

  for(i = 0;i<maxlen;i++){
  		var i1 = parseInt(arr1[i] || 0)
      var i2 = parseInt(arr2[i] || 0)
			if(i1 < i2){
      			return -1;
      }
      else if(i1 > i2){
      			return 1;
      }
  }
  
  return 0;

}));
&#13;
&#13;
&#13;

答案 4 :(得分:-1)

  • 正确排序1.0a表示法
  • 使用本机localeCompare1.090表示法进行排序

function log(label,val){
  document.body.append(label,String(val).replace(/,/g," - "),document.createElement("BR"));
}

const sortVersions = (
  x,
  v = s => s.match(/[a-z]|\d+/g).map(c => c==~~c ? String.fromCharCode(97 + c) : c)
) => x.sort((a, b) => (a + b).match(/[a-z]/) 
                             ? v(b) < v(a) ? 1 : -1 
                             : a.localeCompare(b, 0, {numeric: true}))

let v=["1.90.1","1.090","1.0a","1.0.1","1.0.0a","1.0.0b","1.0.0.1","1.0a"];
log(' input : ',v);
log('sorted: ',sortVersions(v));
log('no dups:',[...new Set(sortVersions(v))]);