Front-End/JavaScript

JavaScript - 배열 안 객체 정렬

Whatever App's 2022. 8. 31. 14:41

 

알고리즘 문제를 풀 때나 현업 프로젝트에서도 정렬은 거의 필연적으로 만나게 된다.

Javascript에서 이미 Array.prototype.sort 라는 메서드를 제공하긴 하지만 그리 간단한 정렬들만 만나기는 참 쉽지 않고 이 정렬 메서드는 굉장히 많은 활용성을 가지게 된다.

 

그 중 배열 안에 있는 객체의 대해서 정렬을 하는 다양한 방법을 소개해볼까 한다.

 

const items = [
  { name: 'Edward', score: 1 },
  { name: 'Sharpe', score: 2 },
  { name: 'And', score: 3 },
  { name: 'The', score: 3 },
  { name: 'Magnetic', score: 4 },
  { name: 'Zeros', score: 5 }
];

 

✌️ 객체 안 "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;
  }
  if (nameA > nameB) {
    return 1;
  }

  // 이름이 같을 경우
  return 0;
});

sort안에서 비교할 두 대상 a와 b를 먼저 대문자로 변경한다.

그 후 if문으로 비교를 통해 오름차순을 할지 내림차순을 할지 결정한다.

같은 문자라면 0을 반환해 그대로 유지한다.

 

✌️ 객체 안 "score"를 통한 오름차순과 내림차순 정렬


items.sort(function (a, b) {
  if (a.score > b.score) {
    return 1;
  }
  if (a.score < b.score) {
    return -1;
  }
  // 같은 값이면 0
  return 0;
});

숫자라면 오히려 쉽다. 따로 a, b의 값을 변환 하지 않고 값의 비교를 통해서 오름차순과 내림차순 정렬이 가능하다.

물론 같은 값이면 0을 반환한다.

 

✌️ 같은 "score"일 때 name을 기준으로 한 오름차순과 내림차순 정렬


items.sort((a, b) => {
  if (a.score === b.score) {
    const x = a.title.toUpperCase();
    const y = b.title.toUpperCase();
    return x < y ? -1 : x > y ? 1 : 0;
  }
  
  return b.score - a.score;
})}

sort 메서드를 사용하는데 있어 특별한 조건문을 사용하고 싶을 때 유용하다고 생각한다.

간혹 같은 값이 있을 때 그 값을 기준으로 다른 정렬을 하고 싶다면 같은 값일 때의 조건을 추가해주고 그 안에서 오름차순 내림차순 정렬을 해주면 된다.

 

위 예제는 많은 if문을 사용하지 않기 위해 마지막 return을 삼항연산자로 심플하게 정리해봤다.

score가 같을 때 오름차순 내림차순을 정렬하고 score가 같지 않다면 내림차순 또는 오름차순을 return해 주면 되겠다.

 

 

 

참조 : Array.prototype.sort() - JavaScript | MDN (mozilla.org)

반응형