サーチ…
前書き
Setオブジェクトを使用すると、プリミティブ値でもオブジェクト参照でも、すべての型の一意の値を格納できます。
Setオブジェクトは値の集合です。セットの要素を挿入順に反復することができます。セット内の値は、 一度だけ発生する可能性があり、それはセットのコレクションでユニークです。 SameValueZero比較アルゴリズムを使用して、 明確な値が区別されます。
構文
- 新しいSet([iterable])
- mySet.add(value)
- mySet.clear()
- mySet.delete(value)
- mySet.entries()
- mySet.forEach(コールバック[、thisArg])
- mySet.has(値)
- mySet.values()
パラメーター
パラメータ | 詳細 |
---|---|
繰り返し可能な | 反復可能オブジェクトが渡された場合、そのすべての要素が新しいSetに追加されます。 nullは未定義として扱われます。 |
値 | Setオブジェクトに追加する要素の値。 |
折り返し電話 | 各要素に対して実行する関数。 |
thisArg | オプション。コールバックを実行するときにこれとして使用する値。 |
備考
セット内の各値は一意でなければならないため、値の等価性はチェックされ、===演算子で使用されているものと同じアルゴリズムに基づいていません。具体的には、Setsの場合、+0(厳密には-0に等しい)と-0は異なる値です。しかし、これは最新のECMAScript 6仕様で変更されています。 Gecko 29.0(Firefox 29 / Thunderbird 29 / SeaMonkey 2.26)(bug 952870)から始まり、最近の夜間のChromeでは+0と-0がSetオブジェクトの同じ値として扱われます。また、NaNとundefinedもSetに格納できます。 NaNはNaNと同じと見なされます(NaN!== NaNの場合でも)。
セットの作成
Setオブジェクトを使用すると、プリミティブ値でもオブジェクト参照でも、すべての型の一意の値を格納できます。
アイテムをセットにプッシュしてプレーンJavaScript配列と同様に反復することはできますが、配列とは異なり、値がすでに存在する場合は値をセットに追加できません。
新しいセットを作成するには:
const mySet = new Set();
または、反復可能オブジェクトからセットを作成して、開始値を与えることができます。
const arr = [1,2,3,4,4,5];
const mySet = new Set(arr);
上の例では、設定されたコンテンツは{1, 2, 3, 4, 5}
ます。値4は、作成に使用された元の配列とは異なり、1回だけ表示されることに注意してください。
セットへの値の追加
Setに値を追加するには、 .add()
メソッドを使用します。
mySet.add(5);
値が既にセットに存在する場合、セットには一意の値が含まれているため、値は再び追加されません。
.add()
メソッドはセット自体を返しますので、追加呼び出しを連鎖させることができます:
mySet.add(1).add(2).add(3);
セットからの値の削除
セットから値を削除するには、 .delete()
メソッドを使用します。
mySet.delete(some_val);
この関数は戻りますtrue
値がセットで存在し、かつ削除された場合、またはfalse
そう。
セットに値が存在するかどうかを確認する
指定された値がセット内に存在するかどうかを調べるには、 .has()
メソッドを使用します。
mySet.has(someVal);
someVal
がセットに含まれる場合はtrue
返し、そうでない場合はfalse
返しtrue
。
セットをクリアする
.clear()
メソッドを使用すると、セット内のすべての要素を削除できます。
mySet.clear();
設定された長さの取得
.size
プロパティを使用すると、セット内の要素数を取得できます
const mySet = new Set([1, 2, 2, 3]);
mySet.add(4);
mySet.size; // 4
このプロパティは、 Array.prototype.length
とは異なり、読み取り専用です。つまり、何かを割り当てることによって変更することはできません。
mySet.size = 5;
mySet.size; // 4
strictモードでは、それはエラーをスローします:
TypeError: Cannot set property size of #<Set> which has only a getter
セットを配列に変換する
時には、例えば使用できるようにするには、配列に設定を変換する必要がありArray.prototype
などの方法.filter()
これを行うには、 Array.from()
またはdestructuring-assignment
使用します。
var mySet = new Set([1, 2, 3, 4]);
//use Array.from
const myArray = Array.from(mySet);
//use destructuring-assignment
const myArray = [...mySet];
これで、偶数だけを含むように配列をフィルタリングし、Setコンストラクタを使用してSetに戻すことができます。
mySet = new Set(myArray.filter(x => x % 2 === 0));
mySet
偶数だけが含まれるようになりました:
console.log(mySet); // Set {2, 4}
交点とセットの違い
Setの交差や差異のための組み込みメソッドはありませんが、それでも実現できますが、配列に変換し、フィルタリングし、Setsに変換し直します。
var set1 = new Set([1, 2, 3, 4]),
set2 = new Set([3, 4, 5, 6]);
const intersection = new Set(Array.from(set1).filter(x => set2.has(x)));//Set {3, 4}
const difference = new Set(Array.from(set1).filter(x => !set2.has(x))); //Set {1, 2}
反復セット
単純for-ofループを使ってSetを反復することができます:
const mySet = new Set([1, 2, 3]);
for (const value of mySet) {
console.log(value); // logs 1, 2 and 3
}
セットを反復処理するとき、最初にセットに追加された順序で常に値を返します。例えば:
const set = new Set([4, 5, 6])
set.add(10)
set.add(5) //5 already exists in the set
Array.from(set) //[4, 5, 6, 10]
あります.forEach()
と同様の方法、 Array.prototype.forEach()
2つのパラメータ、各要素に対して実行されるcallback
、およびcallback
実行時にthis
として使用されるオプションのthisArg
がありcallback
。
callback
は3つの引数があります。最初の2つの引数は、Setの現在の要素( Array.prototype.forEach()
とMap.prototype.forEach()
)との一貫性のためにあり、3番目の引数はSet自身です。
mySet.forEach((value, value2, set) => console.log(value)); // logs 1, 2 and 3