The Set
object lets you store unique values of any type, whether primitive values or object references.
Description
Set
objects are collections of values. You can iterate through the elements of a set in insertion order. A value in the Set
may only occur once; it is unique in the Set
's collection.
Value equality
Because each value in the Set
has to be unique, the value equality will be checked. In an earlier version of ECMAScript specification, this was not based on the same algorithm as the one used in the ===
operator. Specifically, for Set
s, +0
(which is strictly equal to -0
) and -0
were different values. However, this was changed in the ECMAScript 2015 specification. See "Key equality for -0 and 0" in the browser compatibility table for details.
NaN
and undefined
can also be stored in a Set. All NaN
values are equated (i.e. NaN
is considered the same as NaN
, even though NaN !== NaN
).
Constructor
Set()
- Creates a new
Set
object.
Static properties
get Set[@@species]
- The constructor function that is used to create derived objects.
Instance properties
Set.prototype.size
- Returns the number of values in the
Set
object.
Instance methods
Set.prototype.add(value)
- Appends
value
to theSet
object. Returns theSet
object. Set.prototype.clear()
- Removes all elements from the
Set
object. Set.prototype.delete(value)
- Removes the element associated to the
value
and returns the value thatSet.prototype.has(value)
would have previously returned.Set.prototype.has(value)
will returnfalse
afterwards. Set.prototype.has(value)
- Returns a boolean asserting whether an element is present with the given value in the
Set
object or not.
Iteration methods
Set.prototype[@@iterator]()
- Returns a new
Iterator
object that yields the values for each element in theSet
object in insertion order. Set.prototype.keys()
- Returns a new
Iterator
object that yields the values for each element in theSet
object in insertion order. (For Sets, this is the same as thevalues()
method.) Set.prototype.values()
- Returns a new
Iterator
object that yields the values for each element in theSet
object in insertion order. (For Sets, this is the same as thekeys()
method.) Set.prototype.entries()
-
Returns a new
Iterator
object that contains an array of[value, value]
for each element in theSet
object, in insertion order.This is similar to the
Map
object, so that each entry's key is the same as its value for aSet
. Set.prototype.forEach(callbackFn[, thisArg])
- Calls
callbackFn
once for each value present in theSet
object, in insertion order. If athisArg
parameter is provided, it will be used as thethis
value for each invocation ofcallbackFn
.
Examples
Using the Set
object
let mySet = new Set()
mySet.add(1) // Set [ 1 ]
mySet.add(5) // Set [ 1, 5 ]
mySet.add(5) // Set [ 1, 5 ]
mySet.add('some text') // Set [ 1, 5, 'some text' ]
let o = {a: 1, b: 2}
mySet.add(o)
mySet.add({a: 1, b: 2}) // o is referencing a different object, so this is okay
mySet.has(1) // true
mySet.has(3) // false, since 3 has not been added to the set
mySet.has(5) // true
mySet.has(Math.sqrt(25)) // true
mySet.has('Some Text'.toLowerCase()) // true
mySet.has(o) // true
mySet.size // 5
mySet.delete(5) // removes 5 from the set
mySet.has(5) // false, 5 has been removed
mySet.size // 4, since we just removed one value
console.log(mySet)
//
Set(4) { 1, "some text", {β¦}, {β¦} } in Chrome
Iterating Sets
// iterate over items in set // logs the items in the order: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2} for (let item of mySet) console.log(item) // logs the items in the order: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2} for (let item of mySet.keys()) console.log(item) // logs the items in the order: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2} for (let item of mySet.values()) console.log(item) // logs the items in the order: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2} // (key and value are the same here) for (let [key, value] of mySet.entries()) console.log(key) // convert Set object to an Array object, with Array.from let myArr = Array.from(mySet) // [1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}] // the following will also work if run in an HTML document mySet.add(document.body) mySet.has(document.querySelector('body')) // true // converting between Set and Array mySet2 = new Set([1, 2, 3, 4]) mySet2.size // 4 [...mySet2] // [1, 2, 3, 4] // intersect can be simulated via let intersection = new Set([...set1].filter(x => set2.has(x))) // difference can be simulated via let difference = new Set([...set1].filter(x => !set2.has(x))) // Iterate set entries with forEach() mySet.forEach(function(value) { console.log(value) }) // 1 // 2 // 3 // 4
Implementing basic set operations
function isSuperset(set, subset) { for (let elem of subset) { if (!set.has(elem)) { return false } } return true } function union(setA, setB) { let _union = new Set(setA) for (let elem of setB) { _union.add(elem) } return _union } function intersection(setA, setB) { let _intersection = new Set() for (let elem of setB) { if (setA.has(elem)) { _intersection.add(elem) } } return _intersection } function symmetricDifference(setA, setB) { let _difference = new Set(setA) for (let elem of setB) { if (_difference.has(elem)) { _difference.delete(elem) } else { _difference.add(elem) } } return _difference } function difference(setA, setB) { let _difference = new Set(setA) for (let elem of setB) { _difference.delete(elem) } return _difference } // Examples let setA = new Set([1, 2, 3, 4]) let setB = new Set([2, 3]) let setC = new Set([3, 4, 5, 6]) isSuperset(setA, setB) // => true union(setA, setC) // => Set [1, 2, 3, 4, 5, 6] intersection(setA, setC) // => Set [3, 4] symmetricDifference(setA, setC) // => Set [1, 2, 5, 6] difference(setA, setC) // => Set [1, 2]
Relation with Array
objects
let myArray = ['value1', 'value2', 'value3'] // Use the regular Set constructor to transform an Array into a Set let mySet = new Set(myArray) mySet.has('value1') // returns true // Use the spread operator to transform a set into an Array. console.log([...mySet]) // Will show you exactly the same Array as myArray
Remove duplicate elements from the array
// Use to remove duplicate elements from the array const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5] console.log([...new Set(numbers)]) // [2, 3, 4, 5, 6, 7, 32]
Relation with Strings
let text = 'India' let mySet = new Set(text) // Set ['I', 'n', 'd', 'i', 'a'] mySet.size // 5 //case sensitive & duplicate ommision new Set("Firefox") //
Specifications
Specification |
---|
ECMAScript (ECMA-262) The definition of 'Set' in that specification. |
Browser compatibility
Desktop | Mobile | Server | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Set | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 13 | IE Full support 11 | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 14 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
Set() constructor | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 13 | IE Full support 11 | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 14 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
add | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 13 | IE
Partial support
11
| Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 14 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
clear | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 19 | IE Full support 11 | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 19 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
delete | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 13 | IE Full support 11 | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 14 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
entries | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 24 | IE No support No | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 24 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
forEach | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 25 | IE Full support 11 | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 25 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
has | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 13 | IE Full support 11 | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 14 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
Key equality for -0 and 0 | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 29 | IE No support No | Opera Full support 25 | Safari Full support 9 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 29 | Opera Android Full support 25 | Safari iOS Full support 9 | Samsung Internet Android Full support 3.0 | nodejs Full support 4.0.0 |
size | Chrome Full support 38 | Edge Full support 12 | Firefox
Full support
19
| IE Full support 11 | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android
Full support
19
| Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
values | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 24 | IE No support No | Opera Full support 25 | Safari Full support 8 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 24 | Opera Android Full support 25 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
@@iterator | Chrome Full support 43 | Edge Full support 12 | Firefox
Full support
36
| IE No support No | Opera Full support 30 | Safari Full support 9 | WebView Android Full support 43 | Chrome Android Full support 43 | Firefox Android
Full support
36
| Opera Android Full support 30 | Safari iOS Full support 9 | Samsung Internet Android Full support 4.0 | nodejs Full support 0.12 |
@@species | Chrome Full support 51 | Edge Full support 13 | Firefox Full support 41 | IE No support No | Opera Full support 38 | Safari Full support 10 | WebView Android Full support 51 | Chrome Android Full support 51 | Firefox Android Full support 41 | Opera Android Full support 41 | Safari iOS Full support 10 | Samsung Internet Android Full support 5.0 | nodejs
Full support
6.5.0
|
Legend
- Full support
- Full support
- Partial support
- Partial support
- No support
- No support
- See implementation notes.
- See implementation notes.
- User must explicitly enable this feature.
- User must explicitly enable this feature.
- Uses a non-standard name.
- Uses a non-standard name.