--- id: 587d8254367417b2b2512c6e title: Perform a Difference on Two Sets of Data challengeType: 1 --- ## Description
In this exercise we are going to perform a difference on 2 sets of data. We will create a method on our Set data structure called difference. A difference of sets should compare two sets and return the items present in the first set that are absent in the second. This method should take another Set as an argument and return the difference of the two sets. For example, if setA = ['a','b','c'] and setB = ['a','b','d','e'], then the difference of setA and setB is: setA.difference(setB) = ['c'].
## Instructions
## Tests
```yml tests: - text: Your Set class should have a difference method. testString: 'assert(function(){var test = new Set(); return (typeof test.difference === ''function'')}, ''Your Set class should have a difference method.'');' - text: The proper collection was 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 differenceSetAB = setA.difference(setB); return (differenceSetAB.size() === 2) && (differenceSetAB.values() === [ ''a'', ''b'' ])}, ''The proper collection was returned'');' ```
## Challenge Seed
```js function Set() { // the var collection will hold the set var collection = []; // this method will check for the presence of an element and return true or false this.has = function(element) { return (collection.indexOf(element) !== -1); }; // this method will return all the values in the set this.values = function() { return collection; }; // this method will add an element to the set this.add = function(element) { if(!this.has(element)){ collection.push(element); return true; } return false; }; // this method will remove an element from a set this.remove = function(element) { if(this.has(element)){ var index = collection.indexOf(element); collection.splice(index,1); return true; } return false; }; // this method will return the size of the collection this.size = function() { return collection.length; }; // this method will return the union of two sets this.union = function(otherSet) { var unionSet = new Set(); var firstSet = this.values(); var secondSet = otherSet.values(); firstSet.forEach(function(e){ unionSet.add(e); }); secondSet.forEach(function(e){ unionSet.add(e); }); return unionSet; }; // this method will return the intersection of two sets as a new set this.intersection = function(otherSet) { var intersectionSet = new Set(); var firstSet = this.values(); firstSet.forEach(function(e){ if(otherSet.has(e)){ intersectionSet.add(e); } }); return intersectionSet; }; // change code below this line // change code above this line } ```
## Solution
```js function Set() {var collection = []; this.has = function(e){return(collection.indexOf(e) !== -1);};this.values = function() {return collection;};this.add = function(element) {if (!this.has(element)) {collection.push(element);return true;} else {return false;}};this.remove = function(element) {if(this.has(element)) {var i = collection.indexOf(element);collection.splice(i, 1);return true;}return false;};this.size = function() {return collection.length;};this.union = function(set) {var u = new Set();var c = this.values();var s = set.values();c.forEach(function(element){u.add(element);});s.forEach(function(element){u.add(element);});return u;};this.intersection = function(set) {var i = new Set();var c = this.values();c.forEach(function(element){if(s.has(element)) i.add(element);});};this.difference = function(set) {var d = new Set();var c = this.values();c.forEach(function(e){if(!set.has(e)) d.add(e);});};} ```