본문 바로가기

javascript

우선순위 정렬 (javascript)

문법, 어휘, 표현, 듣기, 발음으로 이루어져 있는 영어시험을 보았고 결과를 점수별로 정렬하고 싶습니다. 하지만 동점인 과목이 있으면 더 중요하다고 생각하는 과목이 먼저 나올 수 있도록 정렬을 하려고 합니다. 이러한 경우 어떻게 해야 할까요?

아래의 코드상으로 보자면 scores배열에서 객체들를 score별로 정렬을 한 후 동점일 경우에 priority로 정렬을 하고 싶은 경우가 있을 것입니다.

  const scores = [
       {title: "문법", score: 20, priority: 1},
       {title: "어휘", score: 50, priority: 2},
       {title: "표현", score: 80, priority: 3},
       {title: "듣기", score: 15, priority: 4},
       {title: "발음", score: 10, priority: 5},
  ];
 

javascript의 sort메서드를 활용하면 이를 쉽게 해결할 수 있습니다.

  scores.sort(function (a, b) {
            // 스코어별로 오름차순 정렬
            if (a.score > b.score) return 1;
            if (a.score < b.score) return -1;

            // 스코어 오름차순 정렬된 상태에서 우선순위별로 오름차순 정렬
            if (a.priority > b.priority) return 1;
            if (a.priority < b.priority) return -1;
        });

원리

javascript의 sort메서드는 compareFunction(a, b)을 인자로 받습니다.

compareFunction의 리턴값이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저 옵니다.

양옆의 인자들을 비교하고 return을 통해서 compareFunction이 정렬을 수행합니다.

score가 다 정렬되고 나면 자연스럽게 priority를 비교하게 됩니다.

결과적으로 기본 정렬을 수행한 후 우선순위에 맞는 정렬이 수행됩니다.

 

sort함수의 원리에 대해서는 아래 링크를 통해 더 자세히 알 수 있습니다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort