2013-10-08 5 views
6

좀 JSON과 같은 포맷 것을 :정렬 JSON 순으로

places =[ 
    { 
     "city":"Los Angeles", 
     "country":"USA", 
    }, 
    { 
     "city":"Boston", 
     "country":"USA", 
    }, 
    { 
     "city":"Chicago", 
     "country":"USA", 
    }, 
] 

등등 ...

나는이를 정렬하려고 순으로 CITY BY와 데 그렇게하는 데 어려움이 있습니다. 내 문제의 근본 원인이 문자 대 숫자의 순서를 결정하는 것 같습니다. 간단한 시도 :

places.sort(function(a,b) { 
    return(a.city) - (b.customInfo.city); 
    }); 

아직이 뺄셈은 수행 할 작업을 알지 못합니다. 누군가 나를 도울 수 있습니까?

답변

21

JavaScript에는 sort()에 적합한 값을 반환하는 일반적인 "비교"함수가 없습니다. 비교 연산자를 사용하는 compareStrings 함수를 작성한 다음 정렬 함수에서 사용합니다.

function compareStrings(a, b) { 
    // Assuming you want case-insensitive comparison 
    a = a.toLowerCase(); 
    b = b.toLowerCase(); 

    return (a < b) ? -1 : (a > b) ? 1 : 0; 
} 

places.sort(function(a, b) { 
    return compareStrings(a.city, b.city); 
}) 
+0

거룩한 쓰레기는, 마티, 나는 당신에게 맥주를 빚지고있다. 왜

+2

비교는'<'이고 친구는 문자열에 대한 사전 식 순서를 사용하도록 정의되어 있기 때문에 비교가 효과적입니다. 내부적으로 일치하는 각 문자를 검사하고 두 개의 다른 유니 코드 값을 찾으면 반환하여 "사전"순서로 만듭니다. 이것은 비교 자체가 코드 포인트 값만 비교하기 때문에 LOWCase() 호출을 추가 한 이유이기도합니다. 대소 문자를 확인하지 않습니다. –

4

Matti의 솔루션은 정확하지만 더 간단하게 작성할 수 있습니다. 추가 함수 호출이 필요하지 않습니다. 로직을 sort 콜백에 직접 입력 할 수 있습니다. 대소 문자를 구분하지 정렬을 위해

: 대소 문자를 구분 정렬을 위해

places.sort(function(a, b) { 
    a = a.city.toLowerCase(); 
    b = b.city.toLowerCase(); 

    return a < b ? -1 : a > b ? 1 : 0; 
}); 

:

places.sort(function(a, b) { 
    return a.city < b.city ? -1 : a.city > b.city ? 1 : 0; 
}); 
관련 문제