2011-05-16 3 views
4

문자와 숫자의 조합이 있습니다. 예 : 2E12, 1Z10, 3D13, 3D03, FB14, X002 등자바 스크립트 - 문자 조합 정렬

이 문자열을 정렬하는 몇 가지 방법을 시도했지만 아무것도 작동하지 않습니다. parseInt는 덩어리에서 작동하지만 전체 배열은 정렬되지 않습니다 (json 배열). 정렬을 두 번 실행하면 다른 결과가 나타납니다.

또한 정규식을 사용하여 모든 문자를 숫자로 바꾸려고했지만 논리 오류가 발생합니다. 문자열 중간에 큰 글자가 바뀔 때마다 숫자가 10 또는 20만큼 증가합니다. 예를 들어, 1Z10은 1로 시작하고 맨 위로 정렬해야하지만 12610을 만듭니다.

누구든지 이러한 문자열을 정렬하는 방법을 알고 있습니까? 내가 임의의 겉만 번지르르 한 것들로부터 벗어날 수있는 한, 문자가 첫 번째인지 번호인지는 중요하지 않습니다.

미리 감사드립니다.

+2

당신이 예를 들어 줄 수는 얻어내는 것이 순서 정렬? 간단한 문자열 정렬은 사용자가 묻는 것처럼 보입니다. http://www.javascriptkit.com/javatutors/arraysort.shtml –

답변

10

당신은 그들이 번호 인 것처럼 자리 시퀀스 알파 전에, 정렬 및 그래서 100 종류이 후, 당신은 자연 sort-

이 하나의 예이다라는 것을 필요로 할 경우, 구글은 더 많은 것을 발견 할 것이다 .

// case insensitive, digits to number interpolation 

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.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 S = "2E12, 1Z10, 1z2, 3D13, 3D03, FB14, X002'.split ('');

s.sort (natSort)

/* returned value: (Array) 
1z2,1Z10,2E12,3D03,3D13,FB14,X002 
*/ 
+0

잘 했어. 감사! –

+0

환상적이고 미친 것 같아요. (annoyingly하지만) sort() 자연 정렬 패턴은 숫자를 먼저 쓰고, 숫자는 두 번째 문자 – efwjames

관련 문제