본문 바로가기
JavaScript

[JavaScript] sort()

by hotdog7778 2024. 1. 30.

배열 정렬 메서드 sort

 

sort 기본 문법
✓ Array.sort([compareFunction])
 compareFunction 함수가 정의 되지 않은 기본값에 대해서는 요소를 문자열로 치환하여 유니코드 기반 오름차순 정렬한다.
 compareFunction 함수가 정의 되어 있다면, 함수의 반환값에 따라 정렬을 수행한다.
 sort 함수는 복제본에 수행되지 않고 원본에 수정을 수행한다.

 

비교함수를 사용하지 않고 sort를 사용하면 문자열로 변환 후 유니코드 기반 정렬을 한다는것에 주의하자.

compareFunction 함수가 정의 되지 않은 CASE

const normal = [40, 5, 1, 7];
normal.sort(); // 기본 정렬 : 유니코드 기반 오름차순
console.log(normal); // [ 1, 40, 5, 7]



compareFunction 형식
 결과값이 0 보다 작을 경우 a 가 낮은 색인
 결과값이 0 보다 큰 경우 b 가 낮은 색인

function compare(a, b) {
    if (a is less than b by some ordering criterion) {
      return -1;  // a < b 이면서 a가 낮은 색인 즉, 오름차순
    }
    if (a is greater than b by the ordering criterion) {
      return 1;  // a > b 이면서 b가 낮은 색인 즉, 오름차순
    }
    // a must be equal to b
    return 0;
  }

 

 숫자 비교시 .. a-b 오름차순, b-a 내림차순

const sortArray = [40, 5, 1, 7];
sortArray.sort(function (a, b) {
  // 숫자 비교를 위해
  // a - b 의 결과가 양수 => a 가 크다. => 결과값이 양수(b가 낮은 색인) => [b , a] => 오름차순
  // a - b 의 결과가 음수 => b 가 크다. => 결과값이 음수(a가 낮은 색인) => [a , b] => 오름차순
  return a - b;
});
console.log(sortArray); // [ 1, 5, 7, 40 ]

sortArray.sort(function (a, b) {
  // 숫자 비교를 위해
  // b - a 의 결과가 양수 => b 가 크다. => 결과값이 양수(b가 낮은 색인) => [b , a] => 내림치순
  // b - a 의 결과가 음수 => a 가 크다. => 결과값이 음수(a가 낮은 색인) => [a , b] => 내림차순
  return b - a;
});
console.log(sortArray); // [ 40, 7, 5, 1 ]




객체배열 일때

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 },
];

// value 기준으로 정렬
items.sort(function (a, b) {
  if (a.value > b.value) {
    return 1;
  }
  if (a.value < b.value) {
    return -1;
  }
  // a must be equal to b
  return 0;
});
console.log(items);

// name 기준으로 정렬
items.sort(function (a, b) {
  var nameA = a.name.toUpperCase(); // ignore upper and lowercase
  var nameB = b.name.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
    // a가 낮은 색인
    // a < b
    // [a, b] 오름차순
  }
  if (nameA > nameB) {
    return 1;
    // b가 낮은 색인
    // a > b
    // [b, a] 오름차순
  }

  // 이름이 같을 경우
  return 0;
});
console.log(items);