다음 함수를 사용하면 오름차순 (기본값) 또는 각 속성에서 내림차순으로 하나 이상의 속성에서 객체 배열을 정렬 할 수 있으며 대소 문자 구분 비교를 수행할지 여부를 선택할 수 있습니다. 기본적으로이 함수는 대소 문자를 구분하지 않는 정렬을 수행합니다.
첫 번째 인수는 객체를 포함하는 배열이어야합니다. 후속 인수는 정렬 할 다른 객체 속성을 참조하는 쉼표로 구분 된 문자열 목록이어야합니다. 마지막 인수 (선택 사항)는 대소 문자 구분 정렬을 수행할지 여부를 선택하는 부울 true입니다 (대소 문자 구분 정렬에 사용).
이 기능은 기본적으로 각 속성 / 키를 오름차순으로 정렬합니다. 특정 키를 내림차순으로 정렬하려면 대신 다음 형식으로 배열을 전달하십시오 ['property_name', true].
다음은 함수의 샘플 사용과 설명 ( homes객체를 포함하는 배열)입니다.
objSort(homes, 'city') -> 도시별로 정렬 (오름차순, 대소 문자 구분)
objSort(homes, ['city', true]) -> 도시별로 정렬 (내림차순, 대소 문자 구분)
objSort(homes, 'city', true)-> 도시별로 정렬 한 다음 가격 (오름차순, 대소 문자 구분 )
objSort(homes, 'city', 'price') -> 도시별로 정렬 한 다음 가격 (오름차순, 대소 문자 구분)
objSort(homes, 'city', ['price', true]) -> 도시별로 정렬 (오름차순), 가격 (내림차순), 대소 문자 구분)
그리고 더 이상 고민하지 않고 기능은 다음과 같습니다.
function objSort() {
var args = arguments,
array = args[0],
case_sensitive, keys_length, key, desc, a, b, i;
if (typeof arguments[arguments.length - 1] === 'boolean') {
case_sensitive = arguments[arguments.length - 1];
keys_length = arguments.length - 1;
} else {
case_sensitive = false;
keys_length = arguments.length;
}
return array.sort(function (obj1, obj2) {
for (i = 1; i < keys_length; i++) {
key = args[i];
if (typeof key !== 'string') {
desc = key[1];
key = key[0];
a = obj1[args[i][0]];
b = obj2[args[i][0]];
} else {
desc = false;
a = obj1[args[i]];
b = obj2[args[i]];
}
if (case_sensitive === false && typeof a === 'string') {
a = a.toLowerCase();
b = b.toLowerCase();
}
if (! desc) {
if (a < b) return -1;
if (a > b) return 1;
} else {
if (a > b) return -1;
if (a < b) return 1;
}
}
return 0;
});
} //end of objSort() function
샘플 데이터는 다음과 같습니다.
var homes = [{
"h_id": "3",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": 162500
}, {
"h_id": "4",
"city": "Bevery Hills",
"state": "CA",
"zip": "90210",
"price": 1000000
}, {
"h_id": "5",
"city": "new york",
"state": "NY",
"zip": "00010",
"price": 1000000
}, {
"h_id": "6",
"city": "Dallas",
"state": "TX",
"zip": "85000",
"price": 300000
}, {
"h_id": "7",
"city": "New York",
"state": "NY",
"zip": "00020",
"price": 345000
}];