2010-12-09 74 views
2

什么是排序的最好方式,如果列值是:JavaScript的列进行排序

之前排序:

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, 

排序后:提前

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 

感谢, 约瑟夫

+1

列值?这个模糊。你是指一列中的一堆表格单元格,或者只是从某处返回的一些数组值? – andrewmu 2010-12-09 14:15:30

回答

1

假设您的“列值”在Array中,请使用Array.sort用自定义compareFunction定义您想要的顺序。

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; 
}); 

编辑这里有一个啰嗦compareFunction,似乎你想要做什么,至少在这个例子中你给:

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; 
} 

演示:http://jsfiddle.net/daybarr/h6nmg/

1

首先排序它按字母顺序升序(按'默认'排序 - 或sort()而不传递函数),然后按数字排序。不过,我敢肯定有一个更好的方法:

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")); 

演示:http://jsfiddle.net/karim79/rY8Du/1/

0

一旦你列到一个数组,你可以使用任何自然排序方法, 但你需要写一些额外的行,按照你想要的方式对'*'进行排序。

这里是一个样品 -

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 
*/