Set
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
Set 对象å
è®¸ä½ åå¨ä»»ä½ç±»åï¼æ 论æ¯åå§å¼è¿æ¯å¯¹è±¡å¼ç¨ï¼çå¯ä¸å¼ã
æè¿°
Set 对象æ¯å¼çåéï¼collectionï¼ãéåï¼setï¼ä¸çå
ç´ åªä¼åºç°ä¸æ¬¡ï¼å³éåä¸çå
ç´ æ¯å¯ä¸çãä½ å¯ä»¥æç
§æå
¥é¡ºåºè¿ä»£éåä¸çå
ç´ ãæå
¥é¡ºåºå¯¹åºäº add() æ¹æ³æåå°æ¯ä¸ä¸ªå
ç´ æå
¥å°éåä¸ï¼å³ï¼è°ç¨ add() æ¹æ³æ¶éåä¸ä¸åå¨ç¸åçå
ç´ ï¼ç顺åºã
è§èè¦æ±éåçå®ç°æ¯â对åéä¸çå ç´ çå¹³åè®¿é®æ¶é´ä¸éåä¸å ç´ çæ°é忬¡çº¿æ§å ³ç³»âãå æ¤ï¼å®å¯ä»¥å¨å é¨è¡¨ç¤ºä¸ºæ£åè¡¨ï¼æ¥æ¾çæ¶é´å¤æåº¦ä¸º O(1)ï¼ãæç´¢æ ï¼æ¥æ¾çæ¶é´å¤æåº¦ä¸º O(log(N))ï¼æä»»ä½å ¶ä»çæ¶é´å¤æåº¦ä½äº O(N) çæ°æ®ç»æã
å¼çç¸ç
å¼çç¸çæ¯åºäºé¶å¼ç¸çç®æ³çãï¼æ¾ä½¿ç¨ä¼å° 0 å -0 è§ä¸ºä¸åå¼çåå¼ç®æ³ãåè§æµè§å¨å
¼å®¹æ§ãï¼è¿æå³ç NaN å NaN ä¼è¢«è§ä¸ºæ¯ç¸åçå¼ï¼å³ä½¿ NaN !== NaNï¼ï¼èææå
¶ä»çå¼ååºäº === è¿ç®ç¬¦çè¯ä¹è¿è¡ç¸çæ¯è¾ã
æ§è½
has æ¹æ³æ£æ¥æä¸ªå¼æ¯å¦å¨éåä¸ï¼å
¶éç¨çæ¹å¼ç平忶鴿¯é个æµè¯å
åæ·»å å°éåä¸çå
ç´ æ´å¿«ãç¹å«æ¯å½ä¸ä¸ªæ°ç»çé¿åº¦ï¼lengthï¼çäºéåç大å°ï¼sizeï¼æ¶ï¼è¿æ¯ Array.prototype.includes æ¹æ³çå¹³åé度æ´å¿«ã
éåè¿ç®
Set 对象æä¾äºä¸äºæ¹æ³ï¼å
è®¸ä½ åè¿è¡æ°å¦è¿ç®ä¸æ ·ç»åéåãè¿äºæ¹æ³å
æ¬ï¼
| æ¹æ³ | è¿åç±»å | æ°å¦ä¸çä»·äº | ç»´æ©å¾ |
|---|---|---|---|
A.difference(B) |
Set |
||
A.intersection(B) |
Set |
||
A.symmetricDifference(B) |
Set |
||
A.union(B) |
Set |
||
A.isDisjointFrom(B) |
Boolean |
||
A.isSubsetOf(B) |
Boolean |
||
A.isSupersetOf(B) |
Boolean |
为äºä½¿è¿äºæ¹æ³æ´å
·éç¨æ§ï¼å®ä»¬ä¸ä»
æ¥å Set 对象ï¼è¿å¯ä»¥æ¥åä»»ä½ç±»éå对象ã
ç±»éå对象
ææéåè¿ç®æ¹æ³è¦æ± this æ¯ä¸ä¸ªå®é
ç Set å®ä¾ï¼ä½å®ä»¬çåæ°åªéè¦æ¯ç±»éå对象ãç±»éåå¯¹è±¡æ¯æä¾ä»¥ä¸å
容ç对象ï¼
- ä¸ä¸ª
size屿§ï¼å å«ä¸ä¸ªæ°åã - ä¸ä¸ª
has()æ¹æ³ï¼æ¥åä¸ä¸ªå ç´ å¹¶è¿åä¸ä¸ªå¸å°å¼ã - ä¸ä¸ª
keys()æ¹æ³ï¼è¿åä¸ä¸ªéåä¸çå ç´ çè¿ä»£å¨ã
ä¾å¦ï¼Map 对象æ¯ç±»éå对象ï¼å 为å®ä»¬ä¹å
·æ sizeãhas() å keys()ï¼å æ¤å¨éåæ¹æ³ä¸ä½¿ç¨æ¶ï¼å®ä»¬è¡¨ç°å¾å°±åé®çéåï¼
const a = new Set([1, 2, 3]);
const b = new Map([
[1, "ä¸"],
[2, "äº"],
[4, "å"],
]);
console.log(a.union(b)); // Set(4) {1, 2, 3, 4}
夿³¨ï¼ç±»éååè®®è°ç¨ keys() æ¹æ³è䏿¯ [Symbol.iterator]() æ¥çæå
ç´ ãè¿æ¯ä¸ºäºä½¿ Map æä¸ºææçç±»éå对象ï¼å ä¸ºå¯¹äº Mapï¼è¿ä»£å¨çææ¡ç®ï¼è has() æ¹æ³æ¥åé®ã
æ°ç»ä¸æ¯ç±»éå对象ï¼å 为å®ä»¬æ²¡æ has() æ¹æ³æ size 屿§ï¼å¹¶ä¸å®ä»¬ç keys() æ¹æ³çæç´¢å¼è䏿¯å
ç´ ãWeakSet 对象ä¹ä¸æ¯ç±»éå对象ï¼å 为å®ä»¬æ²¡æ keys() æ¹æ³ã
ç±» Set æµè§å¨ API
æµè§å¨ç±» Set å¯¹è±¡ï¼æâç±»éå对象âï¼æ¯è¡ä¸ºä¸ Set 类似ç Web API æ¥å£ã
å°±å Set 䏿 ·ï¼å
ç´ å¯ä»¥æç
§å®ä»¬è¢«æ·»å å°å¯¹è±¡ç顺åºè¿è¡è¿ä»£ãç±» Set å¯¹è±¡ä¹æä¸ Set ç¸ååç§°åè¡ä¸ºç屿§åæ¹æ³ã使¯ï¼ä¸ Set ä¸åçæ¯ï¼åè
åªå
许æ¯ä¸ªæ¡ç®ç¹å®çé¢å®ä¹ç±»åã
å
许çç±»åç±è§èç IDL å®ä¹ç»åºãä¾å¦ï¼GPUSupportedFeatures æ¯ä¸ä¸ªç±» Set 对象ï¼å®å¿
须以å符串为é®/å¼ãè§èç IDL 对å
¶çå®ä¹å¦ä¸ï¼
interface GPUSupportedFeatures {
readonly setlike<DOMString>;
};
ç±» Set 对象æ¯åªè¯»æå¯è¯»åçï¼åè§ä¸é¢ç IDL ä¸ç readonly å
³é®åï¼ã
- åªè¯»çç±»
Setå¯¹è±¡å ·æsize屿§å以䏿¹æ³ï¼entries()ãforEach()ãhas()ãkeys()ãvalues()å[Symbol.iterator]()ã - å¯åçç±»
Set对象æ¤å¤è¿å ·æä»¥ä¸æ¹æ³ï¼clear()ãdelete()åadd()ã
é¤äºå¯¹æ¡ç®ç±»åçéå¶å¤ï¼æ¹æ³å屿§çè¡ä¸ºä¸ Set ä¸ççææåç¸åã
以䏿¯åªè¯»çç±» Set æµè§å¨å¯¹è±¡ç示ä¾ï¼
以䏿¯å¯åçç±» Set æµè§å¨å¯¹è±¡ç示ä¾ï¼
æé 彿°
Set()-
å建ä¸ä¸ªæ°ç
Set对象ã
éæå±æ§
Set[Symbol.species]-
ç¨äºå建派ç对象çæé 彿°ã
å®ä¾å±æ§
è¿äºå±æ§å®ä¹äº Set.prototype ä¸ï¼ä¸ç±ææ Set å®ä¾å
±äº«ã
Set.prototype.constructor-
å建示ä¾å¯¹è±¡çæé 彿°ã对äº
Setå®ä¾ï¼å ¶åå§å¼ä¸ºSetæé 彿°ã Set.prototype.size-
è¿å
Set对象ä¸å¼çæ°éã Set.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]屿§çåå§å¼ä¸ºå符串"Set"ãè¯¥å±æ§ç¨äºObject.prototype.toString()ã
å®ä¾æ¹æ³
Set.prototype.add()-
妿
Setä¸å°ä¸åå¨å ·æç¸åå¼çå ç´ ï¼åå¨Setå¯¹è±¡ä¸æå ¥ä¸ä¸ªæ°çå ·ææå®å¼çå ç´ ã Set.prototype.clear()-
ä»
Set对象ä¸ç§»é¤ææå ç´ ã Set.prototype.delete()-
ç§»é¤ä¸
valueå ³èçå ç´ ï¼å¹¶è¿åä¸ä¸ªå¸å°å¼æ¥è¡¨ç¤ºæ¯å¦ç§»é¤æåãSet.prototype.has(value)ä¼å¨æ¤ä¹åè¿åfalseã Set.prototype.difference()-
æ¥åä¸ä¸ªéåå¹¶è¿åä¸ä¸ªæ°éåï¼è¯¥éåå 嫿¤éåä¸ä½ä¸å¨ç»å®éåä¸çå ç´ ã
Set.prototype.entries()-
è¿åä¸ä¸ªæ°çè¿ä»£å¨å¯¹è±¡ï¼è¯¥å¯¹è±¡å å«
Set对象ä¸ç代表æ¯ä¸ªå ç´ ç[value, value]æ°ç»ãè¿ä¸Map对象类似ï¼å æ¤Setçæ¯ä¸ªæ¡ç®ç key å value é½ç¸åã Set.prototype.forEach()-
æç §å¼æå ¥ç顺åºä¸º
Set对象ä¸çæ¯ä¸ªå¼è°ç¨ä¸æ¬¡callbackFnã妿æä¾äºthisArgåæ°ï¼å®å°è¢«ç¨ä½æ¯æ¬¡è°ç¨callbackFnæ¶çthiså¼ã Set.prototype.has()-
è¿åä¸ä¸ªå¸å°å¼ï¼è¡¨ç¤ºç»å®å¼å¨
Setå¯¹è±¡ä¸æ¯å¦åå¨ã Set.prototype.intersection()-
æ¥åä¸ä¸ªéåå¹¶è¿åä¸ä¸ªæ°éåï¼è¯¥éåå å«åæ¶å¨æ¤éååç»å®éåä¸çå ç´ ã
Set.prototype.isDisjointFrom()-
æ¥åä¸ä¸ªéåå¹¶è¿åä¸ä¸ªå¸å°å¼ï¼æç¤ºæ¤é忝å¦ä¸ç»å®éåæ²¡æå ±åå ç´ ã
Set.prototype.isSubsetOf()-
æ¥åä¸ä¸ªéåå¹¶è¿åä¸ä¸ªå¸å°å¼ï¼æç¤ºæ¤éåçææå ç´ æ¯å¦é½å¨ç»å®éåä¸ã
Set.prototype.isSupersetOf()-
æ¥åä¸ä¸ªéåå¹¶è¿åä¸ä¸ªå¸å°å¼ï¼æç¤ºç»å®éåçææå ç´ æ¯å¦é½å¨æ¤éåä¸ã
Set.prototype.keys()-
Set.prototype.values()çå«åã Set.prototype.symmetricDifference()-
æ¥åä¸ä¸ªéåå¹¶è¿åä¸ä¸ªæ°éåï¼è¯¥éåå å«å¨æ¤éåæç»å®éåä¸ä½ä¸å¨å¦ä¸è ä¸çå ç´ ã
Set.prototype.union()-
æ¥åä¸ä¸ªéåå¹¶è¿åä¸ä¸ªæ°éåï¼è¯¥éåå å«å¨æ¤éåæç»å®éåä¸çå ç´ ã
Set.prototype.values()-
è¿åä¸ä¸ªæ°çè¿ä»£å¨å¯¹è±¡ï¼è¯¥å¯¹è±¡ææå ¥é¡ºåºçæ
Setå¯¹è±¡ä¸æ¯ä¸ªå ç´ çå¼ã Set.prototype[Symbol.iterator]()-
è¿åä¸ä¸ªæ°çè¿ä»£å¨å¯¹è±¡ï¼è¯¥å¯¹è±¡ææå ¥é¡ºåºçæ
Setå¯¹è±¡ä¸æ¯ä¸ªå ç´ çå¼ã
示ä¾
>ä½¿ç¨ Set 对象
const mySet1 = new Set();
mySet1.add(1); // Set(1) { 1 }
mySet1.add(5); // Set(2) { 1, 5 }
mySet1.add(5); // Set(2) { 1, 5 }
mySet1.add("some text"); // Set(3) { 1, 5, 'some text' }
const o = { a: 1, b: 2 };
mySet1.add(o);
mySet1.add({ a: 1, b: 2 }); // o æ¯ä¸å对象çå¼ç¨ï¼æä»¥è¿æ¯å¯ä»¥ç
mySet1.has(1); // true
mySet1.has(3); // falseï¼å 为并æªå° 3 æ·»å å°éåä¸
mySet1.has(5); // true
mySet1.has(Math.sqrt(25)); // true
mySet1.has("Some Text".toLowerCase()); // true
mySet1.has(o); // true
mySet1.size; // 5
mySet1.delete(5); // ä»éåä¸ç§»é¤ 5
mySet1.has(5); // falseï¼5 å·²ä»éåä¸ç§»é¤
mySet1.size; // 4ï¼å 为æä»¬ååç§»é¤äºä¸ä¸ªå¼
mySet1.add(5); // Set(5) { 1, 'some text', {...}, {...}, 5 }ââå
åå é¤çå
ç´ ä¼ä½ä¸ºæ°çå
ç´ è¢«æ·»å ï¼ä¸ä¼ä¿çå é¤åçåå§ä½ç½®
console.log(mySet1); // Set(5) { 1, "some text", {â¦}, {â¦}, 5 }
è¿ä»£éå
è¿ä»£ä¼æå ç´ çæå ¥é¡ºåºè®¿é®éåä¸çå ç´ ã
for (const item of mySet1) {
console.log(item);
}
// 1ã"some text"ã{ "a": 1, "b": 2 }ã{ "a": 1, "b": 2 }ã5
for (const item of mySet1.keys()) {
console.log(item);
}
// 1ã"some text"ã{ "a": 1, "b": 2 }ã{ "a": 1, "b": 2 }ã5
for (const item of mySet1.values()) {
console.log(item);
}
// 1ã"some text"ã{ "a": 1, "b": 2 }ã{ "a": 1, "b": 2 }ã5
// é®å弿¯ç¸åç
for (const [key, value] of mySet1.entries()) {
console.log(key);
}
// 1ã"some text"ã{ "a": 1, "b": 2 }ã{ "a": 1, "b": 2 }ã5
// ä½¿ç¨ Array.from å° Set 对象转æ¢ä¸ºæ°ç»å¯¹è±¡
const myArr = Array.from(mySet1); // [1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}, 5]
// å¦æå¨ HTML ææ¡£ä¸ä½¿ç¨ï¼ä¹å¯ä»¥ï¼
mySet1.add(document.body);
mySet1.has(document.querySelector("body")); // true
// å¨ Set å Array ä¹é´è½¬æ¢
const mySet2 = new Set([1, 2, 3, 4]);
console.log(mySet2.size); // 4
console.log([...mySet2]); // [1, 2, 3, 4]
// å¯ä»¥éè¿å¦ä¸ä»£ç æ¨¡ææ±äº¤é
const intersection = new Set([...mySet1].filter((x) => mySet2.has(x)));
// å¯ä»¥éè¿å¦ä¸ä»£ç æ¨¡ææ±å·®é
const difference = new Set([...mySet1].filter((x) => !mySet2.has(x)));
// ä½¿ç¨ forEach() è¿ä»£éåä¸çæ¡ç®
mySet2.forEach((value) => {
console.log(value);
});
// 1
// 2
// 3
// 4
å®ç°åºæ¬éåæä½
function isSuperset(set, subset) {
for (const elem of subset) {
if (!set.has(elem)) {
return false;
}
}
return true;
}
function union(setA, setB) {
const _union = new Set(setA);
for (const elem of setB) {
_union.add(elem);
}
return _union;
}
function intersection(setA, setB) {
const _intersection = new Set();
for (const elem of setB) {
if (setA.has(elem)) {
_intersection.add(elem);
}
}
return _intersection;
}
function symmetricDifference(setA, setB) {
const _difference = new Set(setA);
for (const elem of setB) {
if (_difference.has(elem)) {
_difference.delete(elem);
} else {
_difference.add(elem);
}
}
return _difference;
}
function difference(setA, setB) {
const _difference = new Set(setA);
for (const elem of setB) {
_difference.delete(elem);
}
return _difference;
}
// 示ä¾
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 3]);
const 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}
䏿°ç»çå ³ç³»
const myArray = ["value1", "value2", "value3"];
// 使ç¨å¸¸è§ç Set æé 彿°å° Array 转æ¢ä¸º Set
const mySet = new Set(myArray);
mySet.has("value1"); // è¿å true
// 使ç¨å±å¼è¯æ³å° Set 转æ¢ä¸º Arrayã
console.log([...mySet]); // å°æ¾ç¤ºä¸ myArray å®å
¨ç¸åçæ°ç»
æ°ç»å»é
// ç¨äºä»æ°ç»ä¸å é¤éå¤å
ç´
const numbers = [2, 13, 4, 4, 2, 13, 13, 4, 4, 5, 5, 6, 6, 7, 5, 32, 13, 4, 5];
console.log([...new Set(numbers)]); // [2, 13, 4, 5, 6, 7, 32]
ä¸å符串çå ³ç³»
// 大å°åææï¼å
å« "F" å "f"ï¼
new Set("Firefox"); // Set(7) [ "F", "i", "r", "e", "f", "o", "x" ]
// 忽ç¥éå¤é¡¹ï¼"f" åºç°äºä¸¤æ¬¡ï¼ä½æ¯åªå
å«ä¸ä¸ªï¼
new Set("firefox"); // Set(6) [ "f", "i", "r", "e", "o", "x" ]
使ç¨éåæ¥ç¡®ä¿ä¸åå¼çå¯ä¸æ§
const array = Array.from(document.querySelectorAll("[id]")).map((e) => e.id);
const set = new Set(array);
console.assert(set.size === array.length);
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-set-objects> |