Set

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.

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" 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 对象。

静态特性

get Set[@@species]
The constructor function that is used to create derived objects.

实例特性

Set.prototype.size
Returns the number of values in the Set 对象。

实例方法

Set.prototype.add( value )
追加 value Set object. Returns the Set 对象。
Set.prototype.clear()
Removes all elements from the Set 对象。
Set.prototype.delete( value )
Removes the element associated to the value and returns the value that Set.prototype.has( value ) would have previously returned. Set.prototype.has( value ) will return false 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]()
返回新 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()

返回新 Iterator object that contains an array of [ 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 .

范例

使用 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)
// logs Set(4) [ 1, "some text", {}, {} ] in Firefox
// logs 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 对象

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")  // Set(7) [ "F", "i", "r", "e", "f", "o", "x" ]
new Set("firefox")  // Set(6) [ "f", "i", "r", "e", "o", "x" ]
					

规范

规范
ECMAScript (ECMA-262)
The definition of 'Set' in that specification.

浏览器兼容性

更新 GitHub 上的兼容性数据
Desktop Mobile Server
Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet Node.js
Set Chrome 38 Edge 12 Firefox 13 IE 11 Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 14 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
0.12
0.10
Disabled
Disabled From version 0.10: this feature is behind the --harmony runtime flag.
Set() 构造函数 Chrome 38 Edge 12 Firefox 13 IE 11 Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 14 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
0.12
0.10
Disabled
Disabled From version 0.10: this feature is behind the --harmony runtime flag.
add Chrome 38 Edge 12 Firefox 13 IE 部分支持 11
部分支持 11
Returns 'undefined' instead of the 'Set' object.
Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 14 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
0.12
0.10
Disabled
Disabled From version 0.10: this feature is behind the --harmony runtime flag.
clear Chrome 38 Edge 12 Firefox 19 IE 11 Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 19 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
delete Chrome 38 Edge 12 Firefox 13 IE 11 Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 14 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
0.12
0.10
Disabled
Disabled From version 0.10: this feature is behind the --harmony runtime flag.
entries Chrome 38 Edge 12 Firefox 24 IE No Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 24 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
forEach Chrome 38 Edge 12 Firefox 25 IE 11 Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 25 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
has Chrome 38 Edge 12 Firefox 13 IE 11 Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 14 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
0.12
0.10
Disabled
Disabled From version 0.10: this feature is behind the --harmony runtime flag.
Key equality for -0 and 0 Chrome 38 Edge 12 Firefox 29 IE No Opera 25 Safari 9 WebView Android 38 Chrome Android 38 Firefox Android 29 Opera Android 25 Safari iOS 9 Samsung Internet Android 3.0 nodejs 4.0.0
size Chrome 38 Edge 12 Firefox 19
19
From Firefox 13 to Firefox 18, the size property was implemented as a Set.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.
IE 11 Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 19
19
From Firefox 13 to Firefox 18, the size property was implemented as a Set.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.
Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
values Chrome 38 Edge 12 Firefox 24 IE No Opera 25 Safari 8 WebView Android 38 Chrome Android 38 Firefox Android 24 Opera Android 25 Safari iOS 8 Samsung Internet Android 3.0 nodejs 0.12
@@iterator Chrome 43 Edge 12 Firefox 36
36
不支持 27 — 36
Alternate Name
A placeholder property named @@iterator 被使用。
Alternate Name Uses the non-standard name: @@iterator
不支持 17 — 27
Alternate Name
A placeholder property named iterator 被使用。
Alternate Name Uses the non-standard name: iterator
IE No Opera 30 Safari 9 WebView Android 43 Chrome Android 43 Firefox Android 36
36
不支持 27 — 36
Alternate Name
A placeholder property named @@iterator 被使用。
Alternate Name Uses the non-standard name: @@iterator
不支持 17 — 27
Alternate Name
A placeholder property named iterator 被使用。
Alternate Name Uses the non-standard name: iterator
Opera Android 30 Safari iOS 9 Samsung Internet Android 4.0 nodejs 0.12
@@species Chrome 51 Edge 13 Firefox 41 IE No Opera 38 Safari 10 WebView Android 51 Chrome Android 51 Firefox Android 41 Opera Android 41 Safari iOS 10 Samsung Internet Android 5.0 nodejs 6.5.0
6.5.0
6.0.0
Disabled
Disabled From version 6.0.0: this feature is behind the --harmony runtime flag.

图例

完整支持
完整支持
部分支持
部分支持
不支持
不支持
见实现注意事项。
用户必须明确启用此特征。
用户必须明确启用此特征。
使用非标名称。

另请参阅

Metadata