sort()

조아영·2024년 6월 28일

📌

arr.sort([compareFunction])
sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다.

◼ 매개변수

compareFunction : 정렬 순서를 정의하는 함수. 생략하면 정렬할 때 배열의 요소들을 문자열(각 문자의 유니 코드 코드 포인트 값에 따라 정렬)로 취급합니다.

◼ 특징

  • compareFunction(a, b) 형식의 a, b 매개변수를 사용합니다.
  • 반환 값은 (1, 0, -1)을 사용합니다.
  • 0보다 큰 경우(1), b를 a보다 낮은 인덱스(b를 a의 앞으로 정렬)로 정렬합니다.
  • 0을 반환하면, a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다.
  • 0보다 작은 경우(-1), a를 b보다 낮은 인덱스(a를 b의 앞으로 정렬)로 정렬합니다.

◼ 예제

숫자 정렬

const arr = [1, 30, 4, 21, 100000];

// 오름차순
// 방법 1
arr.sort((a, b) => {
    if (a > b) return 1;
    if (a === b) return 0;
    if (a < b) return -1;
});

// 방법 2
arr.sort(function (a, b) {
    return a - b;
});
// 화살표함수
arr.sort((a, b) => a - b);

console.log(arr); // [1, 4, 21, 30, 100000]

// 내림차순
// 방법 1
arr.sort((a, b) => {
    if (a < b) return 1;
    if (a === b) return 0;
    if (a > b) return -1;
});

// 방법 2
arr.sort(function (a, b) {
    return b - a;
});
// 화살표함수
arr.sort((a, b) => b - a);

console.log(arr); // [100000, 30, 21, 4, 1]

문자열 정렬

영어 대문자, 소문자가 섞여있을 경우, 대문자가 소문자보다 앞에 오도록 정렬됩니다.
오름차순 : 숫자 > 영어 대문자 > 영어 소문자 > 한글
내림차순 : 한글 > 영어 소문자 > 영어 대문자 > 숫자

const arr = ['march', 'March', 'jan', 'Jan', 'feb', 'Feb', 'dec', 'Dec'];
const arr2 = ['월', '화', '수', '목', '금'];
const arr3 = ['목', '금', 'march', 'March', 'dec', 'Dec', '3월', '12월'];

// 오름차순
// 방법 1
arr.sort();

// 방법 2
arr.sort((a, b) => a > b ? 1 : -1);

console.log(arr); // ['Dec', 'Feb', 'Jan', 'March', 'dec', 'feb', 'jan', 'march']
console.log(arr2); // ['금', '목', '수', '월', '화']
console.log(arr3); // ['12월', '3월', 'Dec', 'March', 'dec', 'march', '금', '목']

// 대소문자 구분없이 정렬
arr.sort((a, b) => {
    const upperCaseA = a.toUpperCase();
    const upperCaseB = b.toUpperCase();

    if (upperCaseA > upperCaseB) return 1;
    if (upperCaseA === upperCaseB) return 0;
    if (upperCaseA < upperCaseB) return -1;
});

console.log(arr); // ['dec', 'Dec', 'feb', 'Feb', 'jan', 'Jan', 'march', 'March']
console.log(arr2); // ['금', '목', '수', '월', '화']
console.log(arr3); // ['12월', '3월', 'dec', 'Dec', 'march', 'March', '금', '목']

// 내림차순
// 방법 1
arr.sort((a, b) => {
    if (a < b) return 1;
    if (a === b) return 0;
    if (a > b) return -1;
});

// 방법 2
arr.sort((a, b) => a > b ? -1 : 1);

console.log(arr); // ['march', 'jan', 'feb', 'dec', 'March', 'Jan', 'Feb', 'Dec']
console.log(arr2); // ['화', '월', '수', '목', '금']
console.log(arr3); // ['목', '금', 'march', 'dec', 'March', 'Dec', '3월', '12월']

// 대소문자 구분없이 정렬
arr.sort((a, b) => {
    const upperCaseA = a.toUpperCase();
    const upperCaseB = b.toUpperCase();

    if (upperCaseA < upperCaseB) return 1;
    if (upperCaseA === upperCaseB) return 0;
    if (upperCaseA > upperCaseB) return -1;
});

console.log(arr); // ['march', 'March', 'jan', 'Jan', 'feb', 'Feb', 'dec', 'Dec']
console.log(arr2); // ['화', '월', '수', '목', '금']
console.log(arr3); // ['목', '금', 'march', 'March', 'dec', 'Dec', '3월', '12월']

객체 정렬

var items = [
    { name: "홍길동", value: 32 },
    { name: "Edward", value: 21 },
    { name: "Sharpe", value: 37 },
    { name: "이영희", value: 45 },
    { name: 'The', value: -12 },
    { name: "김철수", value: 32 },
    { name: "Zeros", value: 37 },
];

// value 기준으로 정렬
items.sort(function (a, b) {
    if (a.value > b.value) {
        return 1;
    }
    if (a.value < b.value) {
        return -1;
    }
    return 0;
});
// 화살표함수
items.sort((a, b) => {
    if (a.value > b.value) return 1;
    if (a.value < b.value) return -1;
    return 0;
});

console.log(items); 
/* [{name: 'The', value: -12},
{name: 'Edward', value: 21},
{name: '홍길동', value: 32},
{name: '김철수', value: 32},
{name: 'Sharpe', value: 37},
{name: 'Zeros', value: 37},
{name: '이영희', value: 45}] */

// name 기준으로 정렬
items.sort(function (a, b) {
    var nameA = a.name.toUpperCase();
    var nameB = b.name.toUpperCase();
    if (nameA > nameB) {
        return 1;
    }
    if (nameA < nameB) {
        return -1;
    }
    return 0; // 이름이 같을 경우
});
// 화살표함수
items.sort((a, b) => {
    var nameA = a.name.toUpperCase();
    var nameB = b.name.toUpperCase();
    if (nameA > nameB) return 1;
    if (nameA < nameB) return -1;
    return 0;
});

console.log(items);
/* [{name: 'Edward', value: 21},
{name: 'Sharpe', value: 37},
{name: 'The', value: -12},
{name: 'Zeros', value: 37},
{name: '김철수', value: 32},
{name: '이영희', value: 45},
{name: '홍길동', value: 32}] */

0개의 댓글