자바스크립트/모던 자바스크립트

모던 자바스크립트, ES2019 의 stable 내장 정렬 (Array.prototype.sort)

Jake Seo 2023. 3. 15. 19:40

Array.prototype.sort() 의 변화

  • 배열을 정렬할 때 많이 사용되는 메서드이다.
  • ES2019 이후에 큰 변화가 있었다.

ES2019 이전의 Array.prototype.sort()

  • ES2019 이전의 스펙에서는 stable 한 정렬이 요구사항이 아니었다.
    • 정렬 조건이 동일한 엘리먼트가 정렬 이전의 순서를 지키지 않아도 됐다는 뜻이다.
  • 이러한 스펙은 몇몇 경우에 예상치 못한 결과를 초래했다.

ES2019 과 그 이후의 Array.prototype.sort()

  • 정렬 조건이 동일한 엘리먼트가 정렬 이전의 순서를 지켜야만 하는 것이 요구사항이 됐다.
  • 이를 위해 Tim Sort 라는 정렬 알고리즘이 도입되었다.
    • 병합 정렬과 삽입 정렬이 혼합된 것이다.
    • 작은 배열이나 큰 배열 둘 다 성능이 좋다.
    • 이전에 사용되던 Quick Sort 보다 훨씬 빠르고 효율적이다.

안정적인 정렬의 예제

const a = ["b", "B", "a", "A", "c", "C"];
a.sort((left, right) => left.toLowerCase().localeCompare(right.toLowerCase()));
console.log(a); // (6) ['a', 'A', 'b', 'B', 'c', 'C']

const b = ["b", "B", "A", "a", "C", "c"];
b.sort((left, right) => left.toLowerCase().localeCompare(right.toLowerCase()));
console.log(b); // (6) ['A', 'a', 'b', 'B', 'C', 'c']

const c = ["b", "B", "B", "b", "A", "a", "C", "c"];
c.sort((left, right) => left.toLowerCase().localeCompare(right.toLowerCase()));
console.log(c); // (8) ['A', 'a', 'b', 'B', 'B', 'b', 'C', 'c']
  • toLowerCase() 메서드의 결과로 나온 값들은 모두 정렬 조건이 같지만, 원본의 순서에서 순서가 변하지 않는다.
반응형