--- id: 587d8253367417b2b2512c6d title: Perform an Intersection on Two Sets of Data challengeType: 1 forumTopicId: 301709 --- ## Description
In this exercise we are going to perform an intersection on 2 sets of data. We will create a method on our Set data structure called intersection. An intersection of sets represents all values that are common to two or more sets. This method should take another Set as an argument and return the intersection of the two sets. For example, if setA = ['a','b','c'] and setB = ['a','b','d','e'], then the intersection of setA and setB is: setA.intersection(setB) = ['a', 'b'].
## Instructions
## Tests
```yml tests: - text: Your Set class should have a intersection method. testString: assert((function(){var test = new Set(); return (typeof test.intersection === 'function')})()); - text: The proper collection should be returned. testString: assert((function(){ var setA = new Set(); var setB = new Set(); setA.add('a'); setA.add('b'); setA.add('c'); setB.add('c'); setB.add('d'); var intersectionSetAB = setA.intersection(setB); return (intersectionSetAB.size() === 1 && intersectionSetAB.values()[0] === 'c')})()); ```
## Challenge Seed
```js class Set { constructor() { // This will hold the set this.dictionary = {}; this.length = 0; } // This method will check for the presence of an element and return true or false has(element) { return this.dictionary[element] !== undefined; } // This method will return all the values in the set values() { return Object.keys(this.dictionary); } // This method will add an element to the set add(element) { if (!this.has(element)) { this.dictionary[element] = true; this.length++; return true; } return false; } // This method will remove an element from a set remove(element) { if (this.has(element)) { delete this.dictionary[element]; this.length--; return true; } return false; } // This method will return the size of the set size() { return this.length; } // This is our union method union(set) { const newSet = new Set(); this.values().forEach(value => { newSet.add(value); }) set.values().forEach(value => { newSet.add(value); }) return newSet; } // Only change code below this line // Only change code above this line } ```
## Solution
```js class Set { constructor() { this.dictionary = {}; this.length = 0; } has(element) { return this.dictionary[element] !== undefined; } values() { return Object.keys(this.dictionary); } add(element) { if (!this.has(element)) { this.dictionary[element] = true; this.length++; return true; } return false; } remove(element) { if (this.has(element)) { delete this.dictionary[element]; this.length--; return true; } return false; } size() { return this.length; } union(set) { const newSet = new Set(); this.values().forEach(value => { newSet.add(value); }) set.values().forEach(value => { newSet.add(value); }) return newSet; } intersection(set) { const newSet = new Set(); let largeSet; let smallSet; if (this.dictionary.length > set.length) { largeSet = this; smallSet = set; } else { largeSet = set; smallSet = this; } smallSet.values().forEach(value => { if (largeSet.dictionary[value]) { newSet.add(value); } }) return newSet; } } ```