객체에 여러 개의 속성이 있을 때
- 주로 한 가지 기준에 따라 정렬하거나, 여러 기준을 순차적으로 적용하여 정렬
객체 배열을 먼저 age로 정렬하고, age가 같을 경우 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);
}