Set
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´7æ.
* Some parts of this feature may have varying levels of support.
Set ãªãã¸ã§ã¯ãã¯ãããªããã£ãå¤ããªãã¸ã§ã¯ãåç
§ãåãããããããåã§å¤æ°ã®ä¸æã®å¤ãæ ¼ç´ãããã¨ãã§ãã¾ãã
解説
Set ãªãã¸ã§ã¯ãã¯å¤ã®éåã§ãã Set ã«éè¤ããå¤ã¯æ ¼ç´åºæ¥ã¾ããã Set å
ã®å¤ã¯éåå
ã§ä¸æã«ãªãã¾ãã Set ã¯ãã®è¦ç´ ã«ã¤ãã¦æ¿å
¥é ã§å復å¦çãè¡ããã¨ãã§ãã¾ããæ¿å
¥é ã¯ãåè¦ç´ ã add ã¡ã½ããã«ãã£ã¦æ£å¸¸ã« Set ã«æ¿å
¥ãããé çªã«å¯¾å¿ãã¾ãã
仿§æ¸ã§ã¯ Set ã®å®è£
ã«ã¤ãã¦ãå¹³åã¢ã¯ã»ã¹æéãéåå
ã®è¦ç´ æ°ã«å¯¾ãã¦ç·å½¢æ¢ç´¢ä»¥ä¸ãã§ãããã¨ãè¦æ±ããã¦ãã¾ãããããã£ã¦ãè¨ç®éã O(N) ãããåªãã¦ããéããå
é¨çã«ã¯ããã·ã¥è¡¨ï¼ã«ãã¯ã¢ãã㯠O(1)ï¼ãæ¢ç´¢æ¨ï¼ã«ãã¯ã¢ãã㯠O(log(N))ï¼ãã¾ãã¯ä»ã®ãã¼ã¿æ§é ã¨ãã¦è¡¨ããã¨ãã§ãã¾ãã
å¤ã®ç価æ§
å¤ã®ç夿§ã¯ã SameValueZero ã¢ã«ã´ãªãºã ã«åºã¥ãã¦ãã¾ããï¼ä»¥å㯠SameValue ã使ç¨ãã¦ããã0 㨠-0 ã¯ç°ãªããã®ã¨ãã¦æ±ããã¦ãã¾ããã詳ããã¯ãã©ã¦ã¶ã¼ã®äºææ§ã® "Key equality for -0 and 0" ãåç
§ãã¦ãã ãããï¼ã¤ã¾ãã NaN 㯠NaN ã¨åãã¨ã¿ãªããï¼ä¾ã NaN !== NaN ã§ãã£ã¦ãï¼ããã以å¤ã®å¤ã¯ === æ¼ç®åã®æåã«å¾ã£ã¦çããã¨ã¿ãªããã¾ãã
ããã©ã¼ãã³ã¹
has ã¡ã½ããã¯ãå¤ã Set å
ã«ãããã©ããããã§ãã¯ãã¾ããããã¯ã以åã« Set ã«è¿½å ãããè¦ç´ ã®ã»ã¨ãã©ã確èªãããããå¹³åããã¨é«éãªã¢ããã¼ãã使ç¨ãã¾ããç¹ã«ã Array ãªãã¸ã§ã¯ãã® length ã Set ãªãã¸ã§ã¯ãã® size ã¨çããå ´åãå¹³åã㦠Array.prototype.includes ã¡ã½ããããéããªãã¾ãã
Set ã®åæ
Set ãªãã¸ã§ã¯ãã¯ãæ°å¦æ¼ç®ã®ããã«éåãåæããããã®ããã¤ãã®ã¡ã½ãããæä¾ãã¾ãããããã®ã¡ã½ããã«ã¯ã以ä¸ã®ãããªãã®ãããã¾ãã
| ã¡ã½ãã | è¿å¤ã®å | æ°å¦ã®åçã®ãã® | ãã³å³ |
|---|---|---|---|
A.difference(B) |
Set |
||
A.intersection(B) |
Set |
||
A.symmetricDifference(B) |
Set |
||
A.union(B) |
Set |
||
A.isDisjointFrom(B) |
è«çå |
||
A.isSubsetOf(B) |
è«çå |
||
A.isSupersetOf(B) |
è«çå |
ããä¸è¬åã§ããããã«ããããã®ã¡ã½ãã㯠Set ãªãã¸ã§ã¯ãã ãã§ãªããSet 風ãªãã¸ã§ã¯ããåãå ¥ãã¾ãã
Set 風ãªãã¸ã§ã¯ã
ãã¹ã¦ã® Set åæã¡ã½ããã§ã¯ã this ãå®éã® Set ã¤ã³ã¹ã¿ã³ã¹ã§ãããã¨ãè¦æ±ããã¾ããã弿°ã¯ Set 風ã§ããã ãã§æ§ãã¾ãããSet 風ãªãã¸ã§ã¯ãã¨ã¯ã次ã®ãã¨ãæä¾ãããªãã¸ã§ã¯ãã§ãã
sizeããããã£ãæ°å¤ãä¿æãããã¨ãhas()ã¡ã½ãããè¦ç´ ãåããè«çå¤ãè¿ããã¨ãkeys()ã¡ã½ããã Set å ã®è¦ç´ ã®ã¤ãã¬ã¼ã¿ã¼ãè¿ããã¨ã
ä¾ãã°ãMap ãªãã¸ã§ã¯ã㯠Set 風ã§ãããªããªããsizeãhas()ãkeys() ãä¿æãã¦ãããSet ã¡ã½ããã§ä½¿ç¨ããéã«ããã¼ã® Set ã®ããã«åä½ããããã§ãã
const a = new Set([1, 2, 3]);
const b = new Map([
[1, "one"],
[2, "two"],
[4, "four"],
]);
console.log(a.union(b)); // Set(4) {1, 2, 3, 4}
ã¡ã¢:
Set 風ãããã³ã«ã¯ãè¦ç´ ãçæããããã« keys() ã¡ã½ããã [Symbol.iterator]() ã®ä»£ããã«å¼ã³åºãã¾ããããã¯ãMap ãæå¹ãª Set 風ãªãã¸ã§ã¯ãã«ããããã§ãããªããªããMap ã®å ´åãã¤ãã¬ã¼ã¿ã¼ã¯é
ç®ãçæãã¾ãããhas() ã¡ã½ããã¯ãã¼ãåå¾ããããã§ãã
é
åã¯ãhas() ã¡ã½ããã size ããããã£ãæã£ã¦ããããkeys() ã¡ã½ãããè¦ç´ ã§ã¯ãªãã¤ã³ããã¯ã¹ãçæãããããSet 風ã§ã¯ããã¾ãããWeakSet ãªãã¸ã§ã¯ãããkeys() ã¡ã½ãããæããªããããSet 風ã§ã¯ããã¾ããã
Set 風ã®ãã©ã¦ã¶ã¼ API
ãã©ã¦ã¶ã¼ã® Set 風ãªãã¸ã§ã¯ãï¼ã¾ãã¯ãéå風ãªãã¸ã§ã¯ããï¼ã¨ã¯ãã¦ã§ã API ã®ä¸ã§å¤ãã®ç¹ã§ Set ã®ããã«åä½ããã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãã
Set ã®ããã«ãè¦ç´ ã¯ãªãã¸ã§ã¯ãã«è¿½å ããé çªã«å復å¦çãããã¨ãã§ãã¾ãã
Set 風ãªãã¸ã§ã¯ã㨠Set ã«ã¯ãååã¨åä½ãåãããããã£ã¨ã¡ã½ãããããã¾ãã
ããã Set ã¨ã¯ç°ãªããåã¢ã¤ãã ã«ã¯ç¹å®ã®å®ç¾©æ¸ã¿ã®åãã使ç¨ã§ãã¾ããã
許å¯ããã¦ããåã«ã¯ä»æ§æ¸ã® IDL å®ç¾©ã«è¨å®ããã¦ãã¾ãã
ä¾ãã°ã GPUSupportedFeatures 㯠Set 風ãªãã¸ã§ã¯ãã§ããããã¼ã¨å¤ã¨ãã¦æååã使ç¨ããå¿
è¦ãããã¾ãã
ããã¯ä¸è¨ã®ä»æ§ IDL ã§å®ç¾©ããã¦ãã¾ãã
interface GPUSupportedFeatures {
readonly setlike<DOMString>;
};
Set 風ãªãã¸ã§ã¯ãã¯ãèªã¿åãå°ç¨ãèªã¿æ¸ãå¯è½ãã®ã©ã¡ããã§ãï¼ä¸è¨ã® IDL ã§ readonly ãã¼ã¯ã¼ãã確èªãã¦ãã ããã
- èªã¿åãå°ç¨ã®
Set風ãªãã¸ã§ã¯ãã«ã¯size, and the methods: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ã®ä¸ã«ãã£ã¦ä¸ããããéåã®ä¸ã«ãªãè¦ç´ ãå ¥ã£ãæ°ããSetãè¿ãã¾ãã Set.prototype.entries()-
Setãªãã¸ã§ã¯ãå ã®åè¦ç´ ã[value, value]ã®é åã®å½¢ã§æ¿å ¥é ã§è¿ããæ°ããã¤ãã¬ã¼ã¿ã¼ãªãã¸ã§ã¯ããè¿ãã¾ããããã¯Mapãªãã¸ã§ã¯ãã¨ä¼¼ã¦ãã¾ãããããããã®é ç®ã® key ãSetã§ã¯ value ã¨åãã«ãªãã¾ãã Set.prototype.forEach()-
ãã®
Setãªãã¸ã§ã¯ãå ã«åå¨ããåå¤ã«å¯¾ãã¦ãæ¿å ¥é ã«ä¸åº¦ãã¤callbackFnãå¼ã³ã¾ããthisArg弿°ãæå®ãããå ´åãããããã®callbackFnã®å¼ã³åºãã«ããã¦thisã®å¤ã¨ãã¦ä½¿ç¨ããã¾ãã Set.prototype.has()-
ãã®
Setãªãã¸ã§ã¯ãå ã«å¼æ°ã§ä¸ããããå¤ããã¤è¦ç´ ãåå¨ãããã©ããã示ãè«çå¤ãè¿ãã¾ãã Set.prototype.intersection()-
éåãåãããã®
Setã®ä¸ã¨ä¸ããããéåã®ä¸ã®ä¸¡æ¹ã«ããè¦ç´ ãå ¥ã£ãæ°ããSetãè¿ãã¾ãã Set.prototype.isDisjointFrom()-
éåãåãããã®
Setã®ä¸ã«ä¸ããããéåã®ä¸ã®è¦ç´ ããªããã©ããã示ãè«çå¤ãè¿ãã¾ãã Set.prototype.isSubsetOf()-
éåãåãããã®
Setã®ä¸ã®ãã¹ã¦ã®è¦ç´ ãä¸ããããéåã®ä¸ã«åå¨ãããã©ããã示ãè«çå¤ãè¿ãã¾ãã Set.prototype.isSupersetOf()-
éåãåããä¸ããããéåã®ä¸ã®ãã¹ã¦ã®è¦ç´ ããã®
Setã«åå¨ãããã©ããã示ãè«çå¤ãè¿ãã¾ãã Set.prototype.keys()-
Set.prototype.values()ã®å¥åã§ãã Set.prototype.symmetricDifference()-
éåãåãããã®
Setã¾ãã¯ä¸ããããéåã®ä¸ã«åå¨ãããã®ã®ã両æ¹ã«ã¯åå¨ããªãè¦ç´ ãå ¥ã£ãæ°ããSetãè¿ãã¾ãã Set.prototype.union()-
éåãåãããã®
Setã¾ãã¯ä¸ããããéåã®ä¸ã®ã©ã¡ãããã¾ãã¯ä¸¡æ¹ã«åå¨ããè¦ç´ ãå ¥ã£ãæ°ããSetãè¿ãã¾ãã 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ã 1 ã¤ã®å¤ãåé¤ããã°ããã§ãããã
mySet1.add(5); // Set(5) { 1, 'some text', {...}, {...}, 5 }ã ä¸åº¦åé¤ãããè¦ç´ ã¯ãæ°ããè¦ç´ ã¨ãã¦è¿½å ãããããåé¤åã®ä½ç½®ã¯ä¿æãããªã
console.log(mySet1); // Set(5) { 1, "some text", {â¦}, {â¦}, 5 }
Set ã®å復å¦ç
æ¿å ¥é ã«è¦ç´ ã訪åããéåã«å¯¾ããå復å¦çã§ãã
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
// Set ãªãã¸ã§ã¯ãã Array ãªãã¸ã§ã¯ãã« Array.from ã§å¤æ
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); // returns true
union(setA, setC); // returns Set {1, 2, 3, 4, 5, 6}
intersection(setA, setC); // returns Set {3, 4}
symmetricDifference(setA, setC); // returns Set {1, 2, 5, 6}
difference(setA, setC); // returns Set {1, 2}
é åã¨ã®é¢ä¿
const myArray = ["value1", "value2", "value3"];
// é常㮠Set ã³ã³ã¹ãã©ã¯ã¿ã¼ã使ç¨ãã¦ã Array ã Set ã«å¤æ
const mySet = new Set(myArray);
mySet.has("value1"); // returns true
// ã¹ãã¬ããæ¼ç®åã使ã£ã¦ãéåãé
åã«å¤æ
console.log([...mySet]); // myArray ã¨å
¨ãåã Array ã表示ããã¾ãã
é åããéè¤ããè¦ç´ ãåãé¤ã
// é
åããéè¤ããè¦ç´ ãåãé¤ãããã«ä½¿ç¨
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" ã¯æååä¸ã« 2 åç¾ãããã1 ã¤ããå
¥ããªãï¼
new Set("firefox"); // Set(6) [ "f", "i", "r", "e", "o", "x" ]
Set ã使ç¨ãã¦ããªã¹ãä¸ã®å¤ã®ä¸ææ§ãä¿è¨¼
const array = Array.from(document.querySelectorAll("[id]")).map((e) => e.id);
const set = new Set(array);
console.assert(set.size === array.length);
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-set-objects> |