2016-08-16 7 views
0

私は、チャプターシーケンスのストリングの配列を持っています。配列を昇順にソートする必要があります。どのように順序をジャバスクリプトで整理するのですか?

サンプル

var item = ["1.1", "1.1.1", "17.10", "13.11", "11.12", "17.7.a", "6.11", "6.11.1", "1.2", "1.2.1", "1.2.2.a"] 
 

 
console.log("After Sort : " + item.sort());

しかし、期待される結果は

["1.1", "1.1.1", "1.2", "1.2.1", "1.2.2.a", "6.11", "6.11.1", "11.12", "13.11", "17.7.a", "17.10"] 

が、私はこのから答えを得た

に更新されます

Array.prototype.humanSort = function() { 
    return this.sort(function(a, b) { 
    aa = a.split(/(\d+)/); 
    bb = b.split(/(\d+)/); 

    for(var x = 0; x < Math.max(aa.length, bb.length); x++) { 
     if(aa[x] != bb[x]) { 
     var cmp1 = (isNaN(parseInt(aa[x],10)))? aa[x] : parseInt(aa[x],10); 
     var cmp2 = (isNaN(parseInt(bb[x],10)))? bb[x] : parseInt(bb[x],10); 
     if(cmp1 == undefined || cmp2 == undefined) 
      return aa.length - bb.length; 
     else 
      return (cmp1 < cmp2) ? -1 : 1; 
     } 
    } 
    return 0; 
    }); 
} 
+0

'' 1.1.1 ''は数字ではありえない... – Rayon

+0

@Rayon OP明らかに"文字列の配列 "と書かれていますが、なぜあなたが数字を考えているのかわかりません。 –

+0

@NiettheDarkAbsol - 私は 'compareFunction'を期待していました。 – Rayon

答えて

0

各項目は容易に部品の配列を取得する.split(".")ことができます。これはソートできるものです。

このような何かがそれを行うだろう:

item.sort(function(a,b) { 
    a = a.split("."); 
    b = b.split("."); 
    while(a.length && b.length) { 
     if(a[0] == b[0]) { 
      a.shift(); 
      b.shift(); 
      continue; 
     } 
     if(a[0] < b[0]) return -1; 
     return 1; 
    } 
    if(b.length) return -1; // same items but b has more after that 
    if(a.length) return 1; 
    return 0; 
}); 

これは、あなたがしたいのソート順を提供します。

関連する問題