수학적 집학을 구현하기 위한 자료구조이며, 그 특성과 일치한다. 따라서 교집합, 합집합, 차집합, 여집합 등을 구현할 수 있다.
배열과 유사하지만 다음에 기술된 항목에 대해서 차이가 있다.
동일한 값을 중복하여 포함하지 않는다.
요소 순서에 의미가 없다.
인덱스로 요소에 접근할 수 없다.
37.1.1 Set 객체의 생성
Set 객체는 Set 생성자 함수로 생성한다.
constset=newSet();console.log(set); // Set(0){}
//1. Set 생성자 함수는 이터러블을 인수로 전달받아 Set 객체를 생성한다.constset1=newSet([1,2,3,3]);console.log(set1); // Set(3) {1, 2, 3}constset2=newSet("hello");console.log(set2); // Set(4) {"h", "e", "l", "o"}//2. 이터러블의 중복된 값은 Set 객체에 요소로 저장되지 않는다.// 3. 중복을 허용하지 않는 Set 객체의 특성을 활용하여 배열에서 중복된 요소를 제거할 수 있다.// filter를 이용한 배열의 중복 요소 제거constuniq= (array) =>array.filter((v, i, self) =>self.indexOf(v) === i);console.log(uniq([2,1,2,3,4,3,4])); // [2, 1, 3, 4]// Set을 사용한 배열의 중복 요소 제거constuniq= (array) => [...newSet(array)];console.log(uniq([2,1,2,3,4,3,4])); // [2, 1, 3, 4]
constset=newSet();console.log(set); // Set(0) {}// 1. Set객체에 요소 추가 : add 메서드 사용set.add(1);console.log(set); // Set(1) {1}// 2. method chainingset.add(2).add(3);console.log(set); // Set(3) {1, 2, 3}// 3. 중복된 요소를 추가할 경우 무시됨set.add(3).add(3);console.log(set); //Set(3) {1, 2, 3}
// 4. 일치 비교 연산자를 사용하면 NaN과 NaN은 다르다고 평가됨. 그러나 Set 객체는 이를 같다고 평가하여 중복 추가를 허용하지 않음. +0과 -0도 같은 맥락으로 허용하지 않음.constset=newSet();console.log(NaN===NaN); // falseconsole.log(+0===-0); // true// NaN과 NaN을 같다고 평가하여 중복 추가를 허용하지 않는다.set.add(NaN).add(NaN);console.log(set); // Set(1) {NaN}// +0과 -0을 같다고 평가하여 중복 추가를 허용하지 않는다.set.add(+0).add(-0);console.log(set); // Set(2) {NaN, 0}
// 5. Set 객체는 객체나 배열과 같이 자바스크립트의 모든 값을 요소로 저장가능constset=newSet();set.add(1).add("a").add(true).add(undefined).add(null).add({}).add([]).add(() => {});console.log(set); // Set(7) {1, 'a', true, undefined, null, {…}, Array(0), ƒ}
constset=newSet([1,2,3]);// 요소 2를 삭제한다.set.delete(2);console.log(set); // Set(2) {1, 3}// 요소 1을 삭제한다.set.delete(1);console.log(set); // Set(1) {3}// 존재하지 않는 값에 대한 삭제는 무시됨set.delete(0);console.log(set); // Set(1) {3}// delete는 불리언 값을 반환하므로 method chaining이 불가능set.delete(1).delete(2); // TypeError: set.delete(...).delete is not a function
//방법1Set.prototype.union=function (set) {// this(Set 객체)를 복사constresult=newSet(this);for (constvalueof set) {// 합집합은 2개의 Set 객체의 모든 요소로 구성된 집합이다. 중복된 요소는 포함되지 않는다.result.add(value); }return result;};//방법2Set.prototype.union=function (set) {returnnewSet([...this,...set]);};constsetA=newSet([1,2,3,4]);constsetB=newSet([2,4]);// setA와 setB의 합집합console.log(setA.union(setB)); // Set(4) {1, 2, 3, 4}// setB와 setA의 합집합console.log(setB.union(setA)); // Set(4) {2, 4, 1, 3}
차집합
//방법1Set.prototype.difference = funct\ion (set) {// this(Set 객체)를 복사constresult=newSet(this);for (constvalueof set) {// 차집합은 어느 한쪽 집합에는 존재하지만 다른 한쪽 집합에는 존재하지 않는 요소로 구성된 집합이다.result.delete(value); }return result;};//방법2Set.prototype.difference=function (set) {returnnewSet([...this].filter(v =>!set.has(v)));};constsetA=newSet([1,2,3,4]);constsetB=newSet([2,4]);// setA에 대한 setB의 차집합console.log(setA.difference(setB)); // Set(2) {1, 3}// setB에 대한 setA의 차집합console.log(setB.difference(setA)); // Set(0) {}
부분집합과 상위집합
//방법1// this가 subset의 상위 집합인지 확인한다.Set.prototype.isSuperset=function (subset) {for (constvalueof subset) {// superset의 모든 요소가 subset의 모든 요소를 포함하는지 확인if (!this.has(value)) returnfalse; }returntrue;};//방법2// this가 subset의 상위 집합인지 확인한다.Set.prototype.isSuperset=function (subset) {constsupersetArr= [...this];return [...subset].every((v) =>supersetArr.includes(v));};constsetA=newSet([1,2,3,4]);constsetB=newSet([2,4]);// setA가 setB의 상위 집합인지 확인한다.console.log(setA.isSuperset(setB)); // true// setB가 setA의 상위 집합인지 확인한다.console.log(setB.isSuperset(setA)); // false
37.2 Map
Map 은 키와 값의 쌍으로 이루어진 컬렉션이다.
객체와 유사하지만 차이점이 있다.
구분
객체
Map 객체
키로 사용할 수 있는 값
문자열 또는 심벌 값
객체를 포함한 모든 값
이터러블
X
O
요소 개수 확인
Object.keys(obj).length
map.size
37.2.1 Map 객체의 생성
Map 생성자 함수로 생성
constmap=newMap();console.log(map); // Map(0) {}
Map 생성자 함수는 이터러블을 인수로 전달받아 Map객체를 생성함. 이때 인수로 전달되는 이터러블은 키와 값의 쌍으로 이루어진 요소로 구성돼야함
constmap1=newMap([ ["key1","value1"], ["key2","value2"],]);console.log(map1); // Map(2) {"key1" => "value1", "key2" => "value2"}constmap2=newMap([1,2]); // TypeError: Iterator value 1 is not an entry object
Map 생성자 함수의 인수로 전달한 이터러블에 중복된 키를 갖는 요소가 존재하면 갑싱 덮어씌어짐. 즉, Map 객체에는 중복된 키를 갖는 요소가 존재할 수 없다.
constmap=newMap([["key1","value1"]]);// 존재하지 않는 키 'key2'로 요소를 삭제하려 하면 에러없이 무시된다.map.delete("key2");console.log(map); // Map(1) {"key1" => "value1"}
delete는 불리언 값을 반환하므로 method chaining이 불가능
constlee= { name:"Lee" };constkim= { name:"Kim" };constmap=newMap([ [lee,"developer"], [kim,"designer"],]);map.delete(lee).delete(kim); // TypeError: map.delete(...).delete is not a function