JavaScript에서 Set은 고유한 값들을 담는 리스트 형태의 구조예요. 그 값은 원시 값일 수도 있고 객체 참조일 수도 있어요. 배열과 달리 Set의 원소는 인덱스로 접근할 수 없어요.
어떤 값이 Set의 원소 중 하나와 엄격하게 동등하면, 그 값은 Set에 추가할 수 없어요.
const set = new Set();
const object = { color: 'lime green' };
const functionallyIdenticalObject = { color: 'lime green' };
set.add(object);
set.add('wow');
set.add(77);
console.log(set.size);
//=> 3
set.add(functionallyIdenticalObject); // added because functionallyIdenticalObject is not strictly equal to object
console.log(set.size);
//=> 4
set.add(77); // not added because 77 is strictly equal to 77
console.log(set.size);
//=> 4
Set을 만들 때 인자로 배열을 넘길 수 있는데, 그러면 배열의 값들이 Set의 값이 되면서 중복된 값은 제거돼요.
const array = [1, 5, 4, 1];
const set = new Set(array); // the set's values become [1, 5, 4]
console.log(set.size);
//=> 3
Set을 배열로 변환하려면 Array.from()을 사용하면 돼요. Array.from()은 Set이나 Map 같은 이터러블을 배열로 변환해 줘요.
const set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
const array = Array.from(set);
console.log(array);
//=> [1, 2, 3, 4]
Ozan은 다가오는 로드트립을 위해 플레이리스트를 만들고 있어요. 같은 곡을 두 번 듣고 싶지는 않은데, 플레이리스트가 너무 길어져서 어떤 곡을 이미 추가했는지 기억하기 어려워졌어요.
Ozan의 음악 플레이어 API는 배열만 다룰 줄 알아서, 플레이리스트에 곡을 추가하기 전에 Array.indexOf()로 그 곡이 있는지 확인하는 코드를 작성해 보려고 해요. 안타깝게도 이 프로그램은 실행하는 데 시간이 너무 오래 걸려요. Ozan을 도와줘야 해요!
Ozan을 도우러 가보니, 그의 플레이리스트에 _오십만 개_의 곡이 들어 있다는 사실에 깜짝 놀라게 돼요. 어쩌면 플레이리스트를 더 효율적으로 다룰 수 있는 다른 데이터 구조를 알고 있을지도 몰라요.
removeDuplicates 함수를 구현해요. 이 함수는 플레이리스트를 _매개변수_로 받아서 모든 곡이 중복되지 않는 새로운 플레이리스트를 _반환_해요.
const playlist = [
'Court and Spark - Joni Mitchell',
'Big Yellow Taxi - Joni Mitchell',
'Court and Spark - Joni Mitchell',
];
removeDuplicates(playlist);
//=> ['Court and Spark - Joni Mitchell', 'Big Yellow Taxi - Joni Mitchell']
hasTrack 함수를 구현해요. 이 함수는 플레이리스트와 곡을 _매개변수_로 받아서, 플레이리스트에 그 곡이 있는지를 나타내는 불리언을 _반환_해요.
const playlist = [
'The Fashion Show - Grace Jones',
'Dr. Funkenstein - Parliament',
];
hasTrack(playlist, 'Dr. Funkenstein - Parliament');
//=> true
hasTrack(playlist, 'Walking in the Rain - Grace Jones');
//=> false
addTrack 함수를 구현해요. 이 함수는 플레이리스트와 곡을 _매개변수_로 받아서, 그 곡이 포함된 새로운 플레이리스트를 _반환_해요.
const playlist = ['Selma - Bijelo Dugme'];
addTrack(playlist, 'Atomic Dog - George Clinton');
//=> ['Selma - Bijelo Dugme', 'Atomic Dog - George Clinton']
addTrack(playlist, 'Selma - Bijelo Dugme');
//=> ['Selma - Bijelo Dugme', 'Atomic Dog - George Clinton']
deleteTrack 함수를 구현해요. 이 함수는 플레이리스트와 곡을 _매개변수_로 받아서, 그 곡이 포함되지 않은 새로운 플레이리스트를 _반환_해요.
const playlist = [
'The Treasure - Fra Lippo Lippi',
'After the Fall - Klaus Nomi',
];
deleteTrack(playlist, 'The Treasure - Fra Lippo Lippi');
//=> ['After the Fall - Klaus Nomi']
deleteTrack(playlist, 'I Feel the Magic - Belinda Carlisle');
//=> ['After the Fall - Klaus Nomi']
listArtists 함수를 구현해요. 이 함수는 플레이리스트를 _매개변수_로 받아서, 플레이리스트에 있는 고유한 아티스트의 목록을 _반환_해요. 곡 이름은 <SONG> - <ARTIST> 형식으로 되어 있다는 점에 주의해요.
const playlist = [
'All Mine - Portishead',
'Sight to Behold - Devendra Banhart',
'Sour Times - Portishead',
];
listArtists(playlist);
//=> ['Portishead', 'Devendra Banhart']
Exercism에 가입하고 JavaScript 트랙을 개념 37개연습 문제 159개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.