[JS] Array 의 Sort 활용

김현수·2023년 11월 17일
0

JS

목록 보기
5/13


🖋️ Array 의 Sort


객체에 여러 개의 속성이 있을 때

  • 주로 한 가지 기준에 따라 정렬하거나, 여러 기준을 순차적으로 적용하여 정렬

  • 객체 배열을 먼저 age로 정렬하고, age가 같을 경우 name으로 정렬

    • sort() 메서드에 전달된 비교 함수는 두 요소 a와 b를 비교하고, 정렬 순서를 결정

    • a.age - b.age는 나이에 따른 오름차순 정렬

    • a.name.localeCompare(b.name)는 문자열 비교를 통해 이름을 사전 순으로 정렬

let people = [
  { name: "John", age: 25 },
  { name: "Jane", age: 20 },
  { name: "Mary", age: 25 },
  { name: "Mark", age: 30 }
];

people.sort((a, b) => {
  if (a.age === b.age) {
    // 나이가 같으면 이름으로 정렬
    return a.name.localeCompare(b.name);
  }
  // 나이로 정렬
  return a.age - b.age;
});

console.log(people);
  • [출력]
[
  { name: "Jane", age: 20 },
  { name: "John", age: 25 },
  { name: "Mary", age: 25 },
  { name: "Mark", age: 30 }
]

  • 베스트앨범 (프로그래머스 - 해시)

    • 속한 노래가 많이 재생된 장르를 먼저 수록
    • 장르 내에서 많이 재생된 노래를 먼저 수록
    • 장르 내에서 재생 횟수가 같은 노래는 고유 번호가 낮은순
function solution(genres, plays) {
    var dic = {};
  
    // 장르별 재생수
    genres.forEach((t,i)=> {
        dic[t] = dic[t] ?  dic[t] + plays[i] :plays[i];        
    });

    // 반환 리스트의 선택된 장르 각 개수
    var dupDic = {};
  
    return genres
  		  // {장르, 재생수, 인덱스} 객체 리스트로 반환
          .map((t,i)=> ({genre : t, count:plays[i] , index:i}))
          .sort((a,b)=>{   
               // 장르가 다르면 해당 장르끼리 재생수로 비교
               if(a.genre !== b.genre) return dic[b.genre] - dic[a.genre];
               // 장르가 같으면 재생수가 다를 때는 내림차순
               if(a.count !== b.count) return b.count - a.count;
               // 장르와 재생수가 같으면 고유 인덱스 오름차순
               return a.index - b.index;
           })
           .filter(t=>  {
      		   // dupDic 해당 장르의 2개 이상이면 false
               if(dupDic[t.genre] >= 2) return false;
      		   // dupDic 의 해당 장르의 각 개수
               dupDic[t.genre] = dupDic[t.genre] ? dupDic[t.genre]+ 1 : 1;
      		   // 2개 까지 반환 리스트에 true
               return true;
            })
  		   // 고유번호 리스트로 반환
           .map(t=> t.index);    
}
profile
일단 한다

0개의 댓글