DEV Community

Atta
Atta

Posted on • Edited on • Originally published at attacomsian.com

Sets in JavaScript

This post was originally published on attacomsian.com/blog.


A Set is a special type of object in ES6 that lets you create a collection of unique values. Each value appears only once in the set. The values stored in a set can be either primitive types (strings, numbers, booleans) or objects (object literals, arrays).

Initialize a Set

You can use the Set() constructor to create an empty set:

const birds = new Set();
Enter fullscreen mode Exit fullscreen mode

Alternatively, you can pass an iterable object (like an array) to the constructor to initialize the set. All the elements in the iterable will be added to the new set:

const birds = new Set(['๐Ÿฆ', '๐Ÿฆ‰', '๐Ÿฆ†', '๐Ÿฆ…']);
Enter fullscreen mode Exit fullscreen mode

Since strings are iterable, they can also be passed-in to create a set:

const fruits = new Set('๐Ÿ’๐Ÿ‡๐Ÿ‰๐Ÿ“๐Ÿ‘');
Enter fullscreen mode Exit fullscreen mode

Set Methods

Some of the methods you can use on a Set object are add(), has(), size, delete() and clear():

const birds = new Set();

// add items
birds.add('๐Ÿฆ');
birds.add('๐Ÿฆ‰');
birds.add('๐Ÿฆ†');
birds.add('๐Ÿฆ…');

// check if item exists
birds.has('๐Ÿฆ‰'); // true
birds.has('๐Ÿฅ'); // false

// get items count
birds.size; // 4

// delete item
birds.delete('๐Ÿฆ†'); // true
birds.delete('๐Ÿฆ†'); // false - already deleted

// delete all items
birds.clear();
Enter fullscreen mode Exit fullscreen mode

Since a set can only store unique values, calling add() with the same value multiple times won't add new items:

const birds = new Set();
birds.add('๐Ÿฆ');
birds.add('๐Ÿฆ');
birds.add('๐Ÿฆ');

birds.size; // 1

console.log(birds); // Set(1)ย {"๐Ÿฆ"}
Enter fullscreen mode Exit fullscreen mode

Objects in Set

We can also put different objects types such as object literals, arrays, dates, etc. into the set:

const set = new Set(['๐Ÿฆ‰', '๐ŸŒน']);

set.add(['๐Ÿฆ‰', '๐ŸŒ']);
set.add({ name: 'John Doe', planet: 'Earth' });
set.add(new Date());

set.forEach(value => {
    console.log(value);
});

// ๐Ÿฆ‰
// ๐ŸŒน
//ย ["๐Ÿฆ‰", "๐ŸŒ"]
// {name: "John Doe", planet: "Earth"}
// Thu May 16 2019 12:47:09 GMT+0100
Enter fullscreen mode Exit fullscreen mode

Iterating over Sets

You can use forEach() to iterate over sets:

const flowers = new Set(['๐ŸŒท', '๐ŸŒน', '๐ŸŒป', '๐ŸŒธ']);

flowers.forEach(flower => {
    console.log(`Hey ${flower}!`)
});

// Hey ๐ŸŒท!
// Hey ๐ŸŒน!
// Hey ๐ŸŒป!
// Hey ๐ŸŒธ!
Enter fullscreen mode Exit fullscreen mode

You can also use for...of loop to iterate over sets:

for (const flower of flowers) {
    console.log(flower);
}
Enter fullscreen mode Exit fullscreen mode

Keys and Values

Sets also have keys() and values() methods just like Maps. The only exception is the keys() method is just an alias of values() method. Both return a new iterator object with the values in the same order as they were added to the set. We can also use these methods to iterate over the set:

const fruits = new Set('๐Ÿ’๐Ÿ‡๐Ÿ‰๐Ÿ“๐Ÿ‘');

for (const k of fruits.keys()) {
    console.log(k);
}

for (const v of fruits.values()) {
    console.log(v);
}
Enter fullscreen mode Exit fullscreen mode

We can also use the iterator to iterate over the set values one-by-one like the following:

const fruits = new Set('๐Ÿ’๐Ÿ‡๐Ÿ‰');
const items = fruits.values();

console.log(items.next()); // {value: "๐Ÿ’", done: false}
console.log(items.next()); // {value: "๐Ÿ‡", done: false}
console.log(items.next()); // {value: "๐Ÿ‰", done: true}
Enter fullscreen mode Exit fullscreen mode

Calling next() returns each item as a {value: <value>, done: <boolean>} object until the iterator finishes, at which point the done is true. Sets have another method called entries() which also returns an iterator but the value is repeated twice:

const fruits = new Set('๐Ÿ’๐Ÿ‡๐Ÿ‰');
const items = fruits.entries();

console.log(items.next()); // {value: ["๐Ÿ’", "๐Ÿ’"], done: false}
Enter fullscreen mode Exit fullscreen mode

Conclusion

Sets are a new object type introduced in ES6 that allows you to create collections of values. A value can be either a primitive or an object and can occur only once in the set; it is unique in the collection. You can iterate through the values in an order they were inserted in the set.

If you want to learn more, check out our guide on maps in JavaScript.


โœŒ๏ธ I write about modern JavaScript, Node.js, Spring Boot, and all things web development. Subscribe to my newsletter to get web development tutorials & protips every week.


Like this article? Follow @attacomsian on Twitter. You can also follow me on LinkedIn and DEV.

Top comments (14)

Collapse
 
jtenner profile image
jtenner

There is a lot of value when using a Set over an Array.

I learned yesterday that Set#has(item) performs an O(log n) algorithm to determine if the value exists in it. I was able to get a small speed increase in my javascript for it.

Good article!

Collapse
 
karataev profile image
Eugene Karataev

AFAIK, Set.has implementation in V8 is really fast - it has O(1) time complexity.

Collapse
 
jtenner profile image
jtenner

It's entirely possible I learned wrong! I took the statement at face value, knowing I couldn't verify it myself. If that's the case, then I'm really happy I use Set all the time now.

Collapse
 
karataev profile image
Eugene Karataev

Is it correct to say that Set is like array, but with unique items only and Map is like object where keys might be of any type (not limited to strings and symbols)?

Collapse
 
attacomsian profile image
Atta

Well Set might look like an array but there are some notable differences. Apart from unique values, sets have different ways for initializing, accessing / adding / removing values.

Collapse
 
perpetualwar profile image
Srฤ‘an Meฤ‘o

Sets are also unordered lists of elements, unlike arrays.

Thread Thread
 
karataev profile image
Eugene Karataev

Why? We can use forEach method on Sets to iterate the collection by insertion order.

Thread Thread
 
perpetualwar profile image
Srฤ‘an Meฤ‘o

Correct. Iteration is possible in the insertion order, but items are not indexed and they cannot be sorted unless converted to array beforehand. Maybe worth pointing out.

Thread Thread
 
karataev profile image
Eugene Karataev

Agree. Sets also don't have array methods like map/filter/reduce and others. I just don't use Set/Map in my daily work and always forget what data structure is used for. By comparing Set to Array and Map to Object I want to create a mental connection in my head to remember the purpose of these data structures without looking in documentation.

Collapse
 
maxmaxymenko profile image
Max Maxymenko

Man, love those Emojis ๐Ÿ‘Œ๐Ÿ‘€

Collapse
 
attacomsian profile image
Atta

๐Ÿ™

Collapse
 
adam_cyclones profile image
Adam Crockett ๐ŸŒ€

Are set values unique, I can't remember, but if they are passing a string would be destructive, hello world would be helo wrd

Collapse
 
attacomsian profile image
Atta

Yes, Set values are unique. It will filter-out the duplicate characters if you pass a string to create a set.

Collapse
 
adam_cyclones profile image
Adam Crockett ๐ŸŒ€

So that's good for something I'm sure ๐Ÿ˜‹