{
  "$type": "site.standard.document",
  "canonicalUrl": "https://blog.nove-b.dev//posts/javascript-new-set-vs-array",
  "description": "ChatGPTでコード生成したところ、new Set() というオブジェクトが出てきたので調べてみた",
  "path": "/posts/javascript-new-set-vs-array",
  "publishedAt": "2024-06-18T00:00:00.000Z",
  "site": "at://did:plc:2atly2y5kfyjcj5zap6pv4wd/site.standard.publication/3mmxeqr2tcb2k",
  "tags": [
    "JavaScript",
    "new Set()",
    "Array"
  ],
  "textContent": "new Set()ってなに?\n\n先日ChatGPTでコード生成したところ、new Set()というオブジェクトが登場した。\n\nそういえば使ったことあると思い調べてみると、JavaScriptの配列で重複したものを削除し、ユニークな配列を作成するで使っていた。どうやら配列を削除するのに使っていたよう。\n\n実際に調べてみると、\n\n> Set オブジェクトは値のコレクションです。 Set に重複する値は格納出来ません。Set 内の値はコレクション内で一意になります。\n\nとのこと。\n\n簡単に言うと「要素の重複を許可しない配列のこと」だと思う。\n\nじゃあ、配列と何が違うのか。\n\n配列と何が違うのか\n\n配列との違いは、\n\n- 重複を許さない\n- インデックスでアクセスできない\n- あとは追加とか削除とかのメソッドが異なる\n- 高次関数(map, filter, reduce)を使用できない\n\nという点。\n\n重複を許さない\n\nこのように重複した値はなかったことになる。\n\nインデックスでアクセスできない\n\nこんな感じでエラーがでる。\n\n追加とか削除とかのメソッドが異なる\n\nこんな感じ。\n\n高次関数(map, filter, reduce)を使用できない\n\nこれはそのままの意味なので使えないというだけ。\n\nメリットは?\n\n聞く限り重複を削除するときにしか使い道が見つからない。\n\nそこでメリットを調べてみた。\n\n> 要素が含まれているかどうかを効率的に確認できるメソッド has\n> があり、これは配列の includes メソッドよりも高速に動作する\n\nとかなんとか要は配列よりも効率的であることが多いらしい。\n\nつまりパフォーマンスを上げる時はSetを使うべきっぽい。\n\nChatGPT曰く、\n\n> Set は、挿入や削除、存在確認の操作が平均的に O(1) の時間複雑度で行えます。これに対し、配列の操作は要素数に依存するため、最悪の場合 O(n) の複雑度となります。\n\n...うーん、難しい。\n\nincludesとhasで考えると、includesは配列内の全要素を順にチェックして指定した値を探すのに対し、hasはキーと値のペアを効率的に格納および検索するためのデータ構造であるはハッシュテーブルのように動作するため、要素の存在確認が早いとのこと。\n\nなるほど。",
  "title": "JavaScriptのnew Set() って何?? Arrayと何が異なるのか"
}