2010-12-09 3 views
2

Quelle est la meilleure façon de trier si les valeurs de la colonne sont:colonne JavaScript tri

Avant TRIER:

CANCELLED, 
v06.*, 
INDEPENDENT, 
v06.00, 
v06.00.01, 
v06.01, 
v06.02, 
v06.00.xx, 
v06.03, 
v06.04, 
ON HOLD, 
v06.06, 
v06.05, 
v06.05.01, 
v06.04.01, 
v06.05.02, 
v06.07, 
v07.00, 

Après TRIER:

CANCELLED, 
    INDEPENDENT, 
    ON HOLD, 
    v06.*, 
    v06.00, 
    v06.00.01, 
    v06.00.xx, 
    v06.01, 
    v06.02, 
    v06.03, 
    v06.04, 
    v06.04.01, 
    v06.05, 
    v06.05.01, 
    v06.05.02, 
    v06.06, 
    v06.07, 
    v07.00 

Merci à l'avance, Joseph

+1

colonne valeurs? C'est vague. Voulez-vous dire un tas de cellules de tableau dans une colonne ou juste quelques valeurs de tableau retournées de quelque part? – andrewmu

+0

Aussi, probablement, vous voulez dire JavaScript. S'il vous plaît changer le titre pour le dire. Java est une langue très différente et cela pourrait causer de la confusion. (Merci!) – andrewmu

Répondre

1

En supposant que vos "valeurs de colonne" sont dans un Array, utilisez Array.sort avec un compareFunction personnalisé pour définir la commande que vous voulez.

var columnValues = [ 
    "CANCELLED", "v06.*", "INDEPENDENT", "v06.00", "v06.00.01", 
    "v06.01", "v06.02", "v06.00.xx", "v06.03", "v06.04", "ON HOLD", 
    "v06.06", "v06.05", "v06.05.01", "v06.04.01", "v06.05.02", 
    "v06.07", "v07.00" ]; 
columnValues.sort(function(a, b) { 
    if (a is less than b by some ordering criterion) 
     return -1; 
    if (a is greater than b by the ordering criterion) 
     return 1; 
    // a must be equal to b 
    return 0; 
}); 

Modifier est ici une longue haleine compareFunction qui semble faire ce que vous voulez, au moins pour l'exemple que vous donnez:

function(a, b) { 
    if (a==b) { 
     return 0; 
    } 
    if (a.length && a[0]=='v' && b.length && b[0]=='v') { 
     // Both strings are version strings. 
     // Do special case version matching. 
     var aParts = a.substring(1).split('.'), 
      bParts = b.substring(1).split('.'), 
      l = Math.max(a.length, b.length), 
      i = 0; 
     for (;i<l;i++) { 
      var aPart = aParts[i], 
       bPart = bParts[i]; 
      if (aPart == '*' && bPart != '*') { 
       return -1; 
      } 
      if (bPart == '*' && aPart != '*') { 
       return 1; 
      } 
      if (aPart == 'xx' && bPart != 'xx') { 
       return 1; 
      } 
      if (bPart == 'xx' && aPart != 'xx') { 
       return -1; 
      } 
      var aNum = parseInt(aPart,10), 
       bNum = parseInt(bPart,10); 
      if (aNum < bNum) { 
       return -1; 
      } 
      if (aNum > bNum) { 
       return 1; 
      } 
      // Same so far, try next part 
     } 
     // One must be longer than the other. 
     return (aParts.length < bParts.length) ? -1 : 1 
    } 
    // Simple alphabetic comparison 
    if (a < b) 
     return -1; 
    if (a > b) 
     return 1; 
} 

Démo:http://jsfiddle.net/daybarr/h6nmg/

1

Première sorte par ordre alphabétique ascendant (par le tri par défaut - ou sort() sans passer une fonction), puis trier numériquement. Cela dit, je suis sûr qu'il ya une meilleure façon:

function sortNumber(a, b) { 
    return a - b; 
} 

var arr = [ 
    "v07.00", "CANCELLED", "v06.*", "v06.04.01", "INDEPENDENT", "v06.00", "v06.00.01", 
    "v06.01", "v06.02", "v06.00.xx", "v06.03", "v06.04", "ON HOLD", 
    "v06.06", "v06.05", "v06.05.01", "v06.05.02", 
    "v06.07", 
]; 
alert(arr.sort().sort(sortNumber).join("\n")); 

Démo: http://jsfiddle.net/karim79/rY8Du/1/

0

Une fois que vous obtenez la colonne dans un tableau, vous pouvez utiliser une méthode de tri naturel, mais vous devrez écrivez quelques lignes supplémentaires pour trier le '*' comme vous le souhaitez.

Voici un sample-

function natSort(as, bs){ 
    var a, b, a1, b1, i= 0, L, rx= /(\d+)|(\D+)/g, rd= /\d/; 
    if(isFinite(as) && isFinite(bs)) return as - bs; 
    a= String(as).toLowerCase(); 
    b= String(bs).toLowerCase(); 
    if(a=== b) return 0; 
    if(!(rd.test(a) && rd.test(b))) return a> b? 1: -1; 

    a=a.replace('*','0'); // or possibly sort any non alpha nums first: 
    b=b.replace('*','0'); // replace(/[^\w\.]/g,'0'); 

    a= a.match(rx); 
    b= b.match(rx); 
    L= a.length> b.length? b.length: a.length; 
    while(i < L){ 
     a1= a[i]; 
     b1= b[i++]; 
     if(a1!== b1){ 
      if(isFinite(a1) && isFinite(b1)){ 
       if(a1.charAt(0)=== "0") a1= "." + a1; 
       if(b1.charAt(0)=== "0") b1= "." + b1; 
       return a1 - b1; 
      } 
      else return a1> b1? 1: -1; 
     } 
    } 
    return a.length - b.length; 
} 

var v= "v06.05,ON HOLD,v07.00,INDEPENDENT,v06.07,v06.03,v06.*,v06.05.02,v06.05.01,"+ 
"v06.00.xx,v06.00,CANCELLED,v06.02,v06.04,v06.00.01,v06.06,v06.01,v06.04.01"; 
v=v.split(/, */); 

'before sort:\n'+v.join(',\n')+'\n\nafter sort:\n'+ v.sort(natSort).join(',\n') 


/* returned value: 
before sort: 
v06.05, 
ON HOLD, 
v07.00, 
INDEPENDENT, 
v06.07, 
v06.03, 
v06.*, 
v06.05.02, 
v06.05.01, 
v06.00.xx, 
v06.00, 
CANCELLED, 
v06.02, 
v06.04, 
v06.00.01, 
v06.06, 
v06.01, 
v06.04.01 

after sort: 
CANCELLED, 
INDEPENDENT, 
ON HOLD, 
v06.*, 
v06.00, 
v06.00.01, 
v06.00.xx, 
v06.01, 
v06.02, 
v06.03, 
v06.04, 
v06.04.01, 
v06.05, 
v06.05.01, 
v06.05.02, 
v06.06, 
v06.07, 
v07.00 
*/ 
Questions connexes