0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【JavaScript】Map/Set② 〜Set〜

Posted at

概要

JavaScriptを学習、理解を深めるため「JavaScript Primer 迷わないための入門書」を読み、
理解した内容等を記載していく。

【JavaScript】JavaScript入門一覧」に他の記事をまとめています。

この記事で理解できること

  • Set、WeakSetオブジェクトについて
  • Set、WeakSetオブジェクトで使用できるメソッドについて

Set

  • セット型のコレクションを扱うためのビルトインオブジェクト。
  • 配列と異なり要素は順序を持たず、インデックスによるアクセスはできない。

セットとは
重複する値がないことを保証したコレクションのこと。
※コレクションは「何らかのデータをまとめて格納するデータ構造」

セットの作成と初期化

  • Setオブジェクトをnewすることで、新しいセットを作成できる。
  • コンストラクタの初期値として、iterableオブジェクトを渡すことができる。
const set = new Set();
// 作成した時点では何も持っていない
console.log(set.size); // => 0
// 配列はiterableオブジェクト
const numbers = [1, 2, 3, 3];

const set = new Set(numbers);
// セットは重複する値が存在しないことを保証するため同じ値は1つにまとめられる
console.log(set.size); // => 3

値の追加と取り出し

以下のようなセットの要素を扱うメソッドが存在する。

メソッド 概要 構文 返り値
add セットに新しい値を追加 mySet.add(value) (要素が追加された)Setオブジェクト
has セットが指定したvalueに紐づく要素を持っているか確認 mySet.has(value) 存在している場合「true」、存在しない場合「false」
delete セットから指定した要素を削除 mySet.delete(value) 要素を削除できた場合「true」、指定した要素が存在しない場合「false」
clear セットが持つすべての要素を削除 mySet.clear() undefined
const mySet = new Set(["value1", "value2"]);
// 初期値のサイズ
console.log(mySet.size);              // => 2

// 新しい要素の追加
mySet.add("value3");
console.log(mySet.size);              // => 3

// 指定した値に紐づく要素を持っているか確認
console.log(mySet.has("value1"));     // => true
console.log(mySet.has("value4"));     // => false

// 指定した値に紐づく要素を削除
console.log(mySet.delete("value3"));  // => true
console.log(mySet.delete("value3"));  // => false

// セットが持つすべての要素を削除
console.log(mySet.clear());           // => undefined

console.log(mySet.size);              // => 0

セットの反復処理

  • セットが持つ値を反復処理するには、forEachメソッドを使用する。
  • forEachメソッドではセットが持つすべての要素を、セットへの挿入順に反復処理が可能。
  • また、Setオブジェクト自身もiterableなオブジェクトであるためfor...of文で反復処理が可能。
    (keysvaluesentriesメソッドが存在するが、Mapのkey相当の物もないため、あまり有用的ではない)
const mySet = new Set(["value1", "value2"]);

mySet.forEach((value, key, map) => {
  console.log(`value: ${value}`);
});
// => value: value1
// => value: value2

// Setオブジェクトをfor..ofで反復処理
for (const value of mySet) {
  console.log(value);
}
// => value1
// => value2

WeakSet

  • Setと同様にセットを扱うためのビルトインオブジェクト。
  • WeakSetはオブジェクトのみを扱うことができるコレクション。
  • Setと同様に、 WeakSet内の各オブジェクトは重複しないことを保証。
  • Setと違う点は、キーを弱い参照(Weak Reference)で持つこと。
  • WeakSet内に格納されているオブジェクトへの参照が他にない場合、ガベージコレクションによりメモリ領域が解放される。

以下のようなセットの要素を扱うメソッドが存在する。(ここでのセットとはWeakSetのこと)

メソッド 概要 構文 返り値
add セットに新しい値を追加 myWeakSet.add(value) (要素が追加された)Setオブジェクト
has セットが指定したvalueに紐づく要素を持っているか確認 myWeakSet.has(value) 存在している場合「true」、存在しない場合「false」
delete セットから指定した要素を削除 myWeakSet.delete(value) 要素を削除できた場合「true」、指定した要素が存在しない場合「false」
const obj1 = {};
const obj2 = {};
const obj3 = {};

const myWeakSet = new WeakSet([obj1, obj2]);

// 新しい要素の追加
myWeakSet.add(obj3);

// 指定した値に紐づく要素を持っているか確認
console.log(myWeakSet.has(obj3));     // => true
console.log(myWeakSet.has({}));       // => false

// 指定した値に紐づく要素を削除
console.log(myWeakSet.delete(obj3));  // => true
console.log(myWeakSet.delete(obj3));  // => false
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?