アプリケーションを構築するとき、特に大規模なデータセットやリアルタイム要件を扱う場合、パフォーマンスが鍵となるか、少なくとも重要な推進力になることがあります。 JavaScript での最も一般的なタスクの 1 つは、コレクションに値が存在するかどうかを確認することです。最もよく使用される 2 つの代替手段は、Array.includes() と Set.has() です。どちらも機能しますが、実際には Set.has() の方が Array.includes よりも機能します。この理由を詳しく調べて、どちらかの代替手段をいつ使用するべきかを判断しましょう。
使用方法は非常に簡単に見えますが、実装が異なる 2 つのメソッド、つまり Array.includes() と Set.has() があります。
Array.includes()
includes() メソッドは、指定された値が配列内に存在するかどうかを確認します。
O(n) の時間計算量を利用しており、配列の長さが長いほど値のチェックにかかる時間が長くなります。
これは、Array.includes() が配列を最初から最後まで (または値が見つかるまで) 検索し、配列が大きくなるほど時間がかかるためです。
Set.has()
Set の has() メソッドは、指定された値が存在するかどうかもチェックしますが、はるかに高速に実行されます。
Set.has() は、定数時間のルックアップ、つまり O(1) 時間の計算量を可能にするハッシュ テーブル ベースの構造に依存しています。
配列とは異なり、set は一意の値を処理するように構築されているため、内部に重複した値が含まれず、検索時間が長くなります。
Set.has() を使用すると、セット内の項目の数に関係なく、JavaScript は 1 回の直接操作で項目を見つけることができます。たとえば、値が 100 万を含むセット内にあるかどうかをチェックする場合、Set.has() にかかる時間は 10 をチェックする場合とまったく同じになります。
一方、Array.includes() は、目的の項目が見つかるか、最後に到達するまで、各要素を左から右に順番に調べます。つまり、サイズが長くなるほど、特に終わりに近いアイテムの場合や、問題のアイテムがそこにない場合には、チェックに時間がかかることになります。
例を詳しく見てみましょう:
const bigArray = Array.from({ length: 1000000 }, (_, i) => i); const bigSet = new Set(bigArray); const valueToFind = 999999; // Array.includes (O(n)) - Slower for large arrays console.time("Array.includes"); bigArray.includes(valueToFind); console.timeEnd("Array.includes"); // Set.has (O(1)) - Faster for large sets console.time("Set.has"); bigSet.has(valueToFind); console.timeEnd("Set.has");
これを実行すると、大規模な配列では Set.has() が Array.includes() よりもはるかに優れたパフォーマンスを発揮することがわかります。実際には、その違いはアニメーションのスムーズ化、読み込み時間の短縮、またはサーバー上のリソース使用量の削減につながる可能性があります。
これはすべて、あなたが何を達成しようとしているかによって異なります。簡単な概要は次のとおりです:
次の場合は Set.has() を使用します。
次の場合は Array.includes() を使用します。
ブロックされた単語のリストに対して名前をフィルターするユーザー検索機能を実装していると想像してください。ブロックされている単語が何百もあり、頻繁に検索している場合は、ブロックされている単語にセットを使用すると、各検索チェックを高速化できます。
const bigArray = Array.from({ length: 1000000 }, (_, i) => i); const bigSet = new Set(bigArray); const valueToFind = 999999; // Array.includes (O(n)) - Slower for large arrays console.time("Array.includes"); bigArray.includes(valueToFind); console.timeEnd("Array.includes"); // Set.has (O(1)) - Faster for large sets console.time("Set.has"); bigSet.has(valueToFind); console.timeEnd("Set.has");
小規模なケースであっても、セットは物事を効率的かつ予測可能に保つのに役立ちます。さらに、ブロックされる単語のリストが増えても、スケーラブルなソリューションがすでに用意されています。
パフォーマンス: Set.has() は O(1) の時間計算量を提供し、大規模なコレクションの場合は O(n) の Array.includes() よりもはるかに高速になります
適合性: セットは一意の値用に設計されているため、検索用に自然に最適化されます。配列は重複値に対してより柔軟ですが、存在のチェックが遅くなります。
スケーラビリティ: データが増加すると、Set.has() は引き続き良好なパフォーマンスを示しますが、Array.includes() は遅くなります。
Set.has() と Array.includes() のどちらかを選択する場合は、データセットのサイズと性質を理解しておくことが常に重要です。 Array.includes() は小さなデータセットにはまったく問題ありませんが、速度が重要な状況では Set.has() が貴重なツールです。適切なデータ構造は、コードに大きな変更を加えることなく、JavaScript アプリケーションを最適化してより高速かつ効率的にするのに役立ちます。
したがって、そこに何かがあるかどうかを確認していることに気づいたときは、常に自問する必要があります。「それは配列の仕事なのか、それともセットの力を利用できるのか?」これを正しく行うことで、アプリケーションに必要な違いが得られる可能性があります。
以上がSet.has() が Array.includes() よりも項目の検索が速い理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。