The Set
object lets you store unique values of any type, whether primitive values or object references.
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.
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
).
Set()
Set
object.get Set[@@species]
Set.prototype.size
Set
object.Set.prototype.add(value)
value
to the Set
object. Returns the Set
object.Set.prototype.clear()
Set
object.Set.prototype.delete(value)
value
and returns a boolean asserting whether an element was successfully removed or not. Set.prototype.has(value)
will return false
afterwards.Set.prototype.has(value)
Set
object or not.Set.prototype[@@iterator]()
Iterator
object that yields the values for each element in the Set
object in insertion order.Set.prototype.keys()
Iterator
object that yields the values for each element in the Set
object in insertion order. (For Sets, this is the same as the values()
method.)Set.prototype.values()
Iterator
object that yields the values for each element in the Set
object in insertion order. (For Sets, this is the same as the keys()
method.)Set.prototype.entries()
Returns a new Iterator
object that contains[value, value]
for each element in the Set
object, in insertion order.
This is similar to the Map
object, so that each entry's key is the same as its value for a Set
.
Set.prototype.forEach(callbackFn[, thisArg])
callbackFn
once for each value present in the Set
object, in insertion order. If a thisArg
parameter is provided, it will be used as the this
value for each invocation of callbackFn
.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) // logs Set(4) [ 1, "some text", {…}, {…} ] in Firefox // logs Set(4) { 1, "some text", {…}, {…} } in Chrome
// 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
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]
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
// 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]
let text = 'India' let mySet = new Set(text) // Set ['I', 'n', 'd', 'i', 'a'] mySet.size // 5 //case sensitive & duplicate ommision new Set("Firefox") // Set(7) [ "F", "i", "r", "e", "f", "o", "x" ] new Set("firefox") // Set(6) [ "f", "i", "r", "e", "o", "x" ]
const array = Array .from(document.querySelectorAll('[id]')) .map(function(e) { return e.id }); const set = new Set(array); console.assert(set.size == array.length);
Desktop | ||||||
---|---|---|---|---|---|---|
Set |
38 | 12 | 13 | 11 | 25 | 8 |
Set() constructor |
38 | 12 | 13 | 11 | 25 | 8 |
add |
38 | 12 | 13 | 11
|
25 | 8 |
clear |
38 | 12 | 19 | 11 | 25 | 8 |
delete |
38 | 12 | 13 | 11 | 25 | 8 |
entries |
38 | 12 | 24 | No | 25 | 8 |
forEach |
38 | 12 | 25 | 11 | 25 | 8 |
has |
38 | 12 | 13 | 11 | 25 | 8 |
Key equality for -0 and 0 | 38 | 12 | 29 | No | 25 | 9 |
size |
38 | 12 | 19
|
11 | 25 | 8 |
values |
38 | 12 | 24 | No | 25 | 8 |
@@iterator |
43 | 12 | 36
|
No | 30 | 9 |
@@species |
51 | 13 | 41 | No | 38 | 10 |
Mobile | ||||||
---|---|---|---|---|---|---|
Set |
38 | 38 | 14 | 25 | 8 | 3.0 |
Set() constructor |
38 | 38 | 14 | 25 | 8 | 3.0 |
add |
38 | 38 | 14 | 25 | 8 | 3.0 |
clear |
38 | 38 | 19 | 25 | 8 | 3.0 |
delete |
38 | 38 | 14 | 25 | 8 | 3.0 |
entries |
38 | 38 | 24 | 25 | 8 | 3.0 |
forEach |
38 | 38 | 25 | 25 | 8 | 3.0 |
has |
38 | 38 | 14 | 25 | 8 | 3.0 |
Key equality for -0 and 0 | 38 | 38 | 29 | 25 | 9 | 3.0 |
size |
38 | 38 | 19
|
25 | 8 | 3.0 |
values |
38 | 38 | 24 | 25 | 8 | 3.0 |
@@iterator |
43 | 43 | 36
|
30 | 9 | 4.0 |
@@species |
51 | 51 | 41 | 41 | 10 | 5.0 |
Server | |
---|---|
Set |
0.12
|
Set() constructor |
0.12
|
add |
0.12
|
clear |
0.12 |
delete |
0.12
|
entries |
0.12 |
forEach |
0.12 |
has |
0.12
|
Key equality for -0 and 0 | 4.0.0 |
size |
0.12 |
values |
0.12 |
@@iterator |
0.12 |
@@species |
6.5.0
|
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set