Last active
July 5, 2018 19:17
-
-
Save abstractmachines/ba21a7f296e6d1726a3a2e845834b2ec to your computer and use it in GitHub Desktop.
JavaScript Iterators: Sets and Maps
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* JavaScript Iterators | |
Sets and Maps | |
Sets and Maps can be made Iterable/Iterator by using the methods .entries(), .keys(), | |
values(), and/or via for of construct. | |
A Set is a unique (non repeated) version of a Bag data structure. Characteristic equation | |
is contains() or has(). | |
A Map (in JS) is a key-value pair data structure, unordered (in order of insertion). | |
In ES6 (and beyond) we tend to use Maps instead of Objects for iteration, because the Object | |
prototype chain can be problematic for iteration. | |
Map keys can be any data type (objects, functions, primitives); Object keys can only be | |
Strings/Symbols. Maps also have better performance for frequent insertions and deletions | |
according to MDN, but the MDN article does not specify whether Maps are more performant | |
temporally or for memory. | |
Sources: | |
1 - Data structures and algorithms at Princeton and MIT open courseware | |
2 - Axel Rauschmeyer: http://exploringjs.com/es6/ch_iteration.html | |
3 - http://www.zsoltnagy.eu/es6-iterators-and-generators-in-practice/ | |
4 - MDN on Maps: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map | |
*/ | |
// Code done on node REPL instead of WebpackBin | |
// Set | |
const jazzCats = new Set( [ 'paul chambers', 'monk', 'coltrane' ] ) | |
> jazzCats | |
Set { 'paul chambers', 'monk', 'coltrane' } | |
// Sets.entries() makes iterable. Obviously .keys() and .values() would produce identical results. | |
> jazzCats.entries() | |
SetIterator { | |
[ 'paul chambers', 'paul chambers' ], | |
[ 'monk', 'monk' ], | |
[ 'coltrane', 'coltrane' ] } | |
// Map | |
const artists = new Map( [[ 'jazz', 'coltrane'], ['funk', 'curtis mayfield' ]] ) | |
> artists | |
Map { 'jazz' => 'coltrane', 'funk' => 'curtis mayfield' } | |
> artists.entries() | |
MapIterator { [ 'jazz', 'coltrane' ], [ 'funk', 'curtis mayfield' ] } | |
> artists.keys() | |
MapIterator { 'jazz', 'funk' } | |
> artists.values() | |
MapIterator { 'coltrane', 'curtis mayfield' } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
For of on Maps (and Sets)
Iterating through entire key-value collection with for of
Same thing, with specifying key and value for each element
Conversions
You can convert a Set to an Array with the Spread Operator :
let anArray = [...aSet]