2013-01-06 3 views
0

다음과 같이 값과 텍스트로 선택 옵션을 정렬하려고합니다. 텍스트는 특수 문자를 가질 수 있으므로 정렬해야합니다. 그러나 일부 특수 문자가 알파벳 뒤에 오는 것을 발견했습니다. 모든 특수 문자를 먼저 입력 한 다음 알파벳을 입력하고 싶습니다.자바 스크립트 배열 정렬

c = [["#test","#test"], ["?test", "?test"], ["test", "test"], ["TEst", "TEst"], ["]test", "]test"]] 
    >>> c.sort() 
    [["#test", "#test"], ["?test", "?test"], ["TEst", "TEst"], ["]test", "]test"], ["test", "test"]] 

문제는 'TEst'인 것 같습니다.

또 다른 간단한 예 :

cool = ['#new','?new','[new',']new','NEw','&new','cool','ind'] 
["#new", "?new", "[new", "]new", "NEw", "&new", "cool", "ind"] 
cool.sort() 
["#new", "&new", "?new", "NEw", "[new", "]new", "cool", "ind"] 

답변

2

문제는 ASCII codes 91-96 and 123-126와 문자로 특별히입니다 구두점 또는 특수 문자이지만 알파벳 문자보다 높은 코드를 가지고 있습니다. 따라서 정렬 함수는이를 고려해야합니다.

예를 들어 문자를 낮은 ASCII 문자에 매핑하여이 작업을 수행 할 수 있습니다. http://jsfiddle.net/LGjnY/4/

function transformString(s) { 
    var r = '', 
    code; 
    for (var i = 0; i < s.length; i++) { 
    code = s.charCodeAt(i); 
    // map 91-96 onto 22-27 
    if (code >= 91 && code <= 96) code -= 69; 
    // map 123-126 onto 28-31 
    else if (code >= 123 && code <= 126) code -= 95; 
    r += String.fromCharCode(code); 
    } 
    return r; 
} 
c.sort(function (a, b) { 
    return transformString(a[0]).localeCompare(transformString(b[0])); 
}); 

또는 비교 및 ​​변환을 결합하면 더 빨리 만들; 예에서

function compareTransformedStrings(a, b) { 
    if (a == b) return 0; 
    for (var i = 0, A, B; (A = a.charCodeAt(i)) && (B = b.charCodeAt(i)); i++) { 
     if (A != B) { 
      return A - (A >= 91 && A <= 96) * 69 - (A >= 123 && A <= 126) * 95 
       < B - (B >= 91 && B <= 96) * 69 - (B >= 123 && B <= 126) * 95 
       ? -1 : 1; 
     } 
    } 
    return a.length < b.length ? -1 : 1; 
} 
c.sort(function (a, b) { 
    return compareTransformedStrings(a[0], b[0]); 
}); 
2

당신은처럼 .sort() 함수 인자로 비교 함수를 전달할 수

c.sort(function(a, b) { 
    if (a.charCodeAt(0) <= 49) { 
     return -1; 
    } 

    return a.localeCompare(b); 
}) 

데모 : http://jsfiddle.net/7DUEg/

+0

이 기본 정렬에서 전혀 차이가 없습니다 (jsfiddle 정말 테스트하지). 그리고 나는'a'와'b'가 모두 ASCII 49 이하일 때 정렬 순서가 불확실 할 것이라고 생각합니다. – Stuart

+0

@ 스튜어트 : 분명히 원하는 결과를 얻기 위해 그의 코드를 향상시키는 방법을 OP에 제안했습니다. 모든 요구 사항에 맞게 비교 기능을 변경하는 것은 영업에 달려 있습니다. – zerkms

+0

충분히 공정하고, 그냥 코드에 대해 오해하지 않았는지 확인하고 싶었습니다. – Stuart