JavaScript 配列メソッドの背後にあるアルゴリズム。
JavaScript 配列には、配列内のデータの操作と取得を可能にするさまざまな組み込みメソッドが付属しています。アウトラインから抽出された配列メソッドのリストは次のとおりです:
- concat()
- 結合()
- fill()
- 含む()
- indexOf()
- リバース()
- ソート()
- スプライス()
- at()
- copyWithin()
- フラット()
- Array.from()
- findLastIndex()
- forEach()
- 毎回()
- エントリ()
- 値()
- toReversed() (元の配列を変更せずに配列の逆コピーを作成します)
- toSorted() (元の配列を変更せずに配列の並べ替えられたコピーを作成します)
- toSpliced() (元の配列を変更せずに要素を追加または削除して新しい配列を作成します)
- with() (特定の要素が置換された配列のコピーを返します)
- Array.fromAsync()
- Array.of()
- マップ()
- flatMap()
- reduce()
- reduceRight()
- いくつか()
- find()
- findIndex()
- findLast()
各 JavaScript 配列メソッドに使用される一般的なアルゴリズムを詳しく説明します。
1.concat()
- アルゴリズム: 線形追加/マージ
- 時間計算量: O(n) (n はすべての配列の合計長です)
- 内部で反復を使用して新しい配列を作成し、要素をコピーします
// concat() Array.prototype.myConcat = function(...arrays) { const result = [...this]; for (const arr of arrays) { for (const item of arr) { result.push(item); } } return result; };
2.結合()
- アルゴリズム: 文字列連結による線形トラバーサル
- 時間計算量: O(n)
- 配列要素を反復処理し、結果の文字列を構築します
// join() Array.prototype.myJoin = function(separator = ',') { let result = ''; for (let i = 0; i <h3> 3.fill() </h3>
- アルゴリズム: 代入を伴う線形トラバース
- 時間計算量: O(n)
- 値の割り当てによる単純な反復
// fill() Array.prototype.myFill = function(value, start = 0, end = this.length) { for (let i = start; i <h3> 4. include() </h3>
- アルゴリズム: 線形探索
- 時間計算量: O(n)
- 要素が見つかるか終わりに達するまで順次スキャン
// includes() Array.prototype.myIncludes = function(searchElement, fromIndex = 0) { const startIndex = fromIndex >= 0 ? fromIndex : Math.max(0, this.length + fromIndex); for (let i = startIndex; i <h3> 5.indexOf() </h3>
- アルゴリズム: 線形探索
- 時間計算量: O(n)
- 開始から一致が見つかるまでの連続スキャン
// indexOf() Array.prototype.myIndexOf = function(searchElement, fromIndex = 0) { const startIndex = fromIndex >= 0 ? fromIndex : Math.max(0, this.length + fromIndex); for (let i = startIndex; i <h3> 6. リバース() </h3>
- アルゴリズム: 2 ポイントの交換
- 時間計算量: O(n/2)
- 要素を開始/終了から内側に向かって入れ替えます
// reverse() Array.prototype.myReverse = function() { let left = 0; let right = this.length - 1; while (left <h3> 7. ソート() </h3>
- アルゴリズム: 通常は TimSort (マージ ソートと挿入ソートのハイブリッド)
- 時間計算量: O(n log n)
- 最新のブラウザは適応型並べ替えアルゴリズムを使用しています
// sort() Array.prototype.mySort = function(compareFn) { // Implementation of QuickSort for simplicity // Note: Actual JS engines typically use TimSort const quickSort = (arr, low, high) => { if (low { const pivot = arr[high]; let i = low - 1; for (let j = low; j <h3> 8.スプライス() </h3>
- アルゴリズム: 線形配列変更
- 時間計算量: O(n)
- 要素をシフトし、配列をその場で変更します
// splice() Array.prototype.mySplice = function(start, deleteCount, ...items) { const len = this.length; const actualStart = start 0) { // Moving elements right for (let i = len - 1; i >= actualStart + actualDeleteCount; i--) { this[i + shiftCount] = this[i]; } } else if (shiftCount <h3> 9.at() </h3>
- アルゴリズム: 直接インデックス アクセス
- 時間計算量: O(1)
- 境界チェックを備えた単純な配列のインデックス付け
// at() Array.prototype.myAt = function(index) { const actualIndex = index >= 0 ? index : this.length + index; return this[actualIndex]; };
10.copyWithin()
- アルゴリズム: ブロックメモリコピー
- 時間計算量: O(n)
- 内部メモリのコピーとシフト操作
// copyWithin() Array.prototype.myCopyWithin = function(target, start = 0, end = this.length) { const len = this.length; let to = target <h3> 11.フラット() </h3>
- アルゴリズム: 再帰的深さ優先トラバーサル
- 時間計算量: 単一レベルの場合は O(n)、深さ d の場合は O(d*n)
- ネストされた配列を再帰的に平坦化します
// flat() Array.prototype.myFlat = function(depth = 1) { const flatten = (arr, currentDepth) => { const result = []; for (const item of arr) { if (Array.isArray(item) && currentDepth <h3> 12. Array.from() </h3>
- アルゴリズム: 反復とコピー
- 時間計算量: O(n)
- 反復可能な配列から新しい配列を作成します
// Array.from() Array.myFrom = function(arrayLike, mapFn) { const result = []; for (let i = 0; i <h3> 13. findLastIndex() </h3>
- アルゴリズム: 逆線形探索
- 時間計算量: O(n)
- 最後から一致が見つかるまで順次スキャン
// findLastIndex() Array.prototype.myFindLastIndex = function(predicate) { for (let i = this.length - 1; i >= 0; i--) { if (predicate(this[i], i, this)) return i; } return -1; };
14.forEach()
- アルゴリズム: 線形反復
- 時間計算量: O(n)
- コールバック実行による単純な反復
// forEach() Array.prototype.myForEach = function(callback) { for (let i = 0; i <h3> 15. 毎() </h3> <p>アルゴリズム: ショートリニアスキャン<br> 時間計算量: O(n)<br> 最初の false 条件で停止します<br> </p><pre class="brush:php;toolbar:false">// concat() Array.prototype.myConcat = function(...arrays) { const result = [...this]; for (const arr of arrays) { for (const item of arr) { result.push(item); } } return result; };
16. エントリー()
- アルゴリズム: イテレータープロトコルの実装
- 時間計算量: 作成の場合は O(1)、完全な反復の場合は O(n)
- 反復子オブジェクトを作成します
// join() Array.prototype.myJoin = function(separator = ',') { let result = ''; for (let i = 0; i <h3> 17. 値() </h3>
- アルゴリズム: イテレータープロトコルの実装
- 時間計算量: 作成の場合は O(1)、完全な反復の場合は O(n)
- 値のイテレータを作成します
// fill() Array.prototype.myFill = function(value, start = 0, end = this.length) { for (let i = start; i <h3> 18.toReversed() </h3>
- アルゴリズム: 逆反復によるコピー
- 時間計算量: O(n)
- 新しい反転配列を作成します
// includes() Array.prototype.myIncludes = function(searchElement, fromIndex = 0) { const startIndex = fromIndex >= 0 ? fromIndex : Math.max(0, this.length + fromIndex); for (let i = startIndex; i <h3> 19. toSorted() </h3>
- アルゴリズム: コピーして TimSort
- 時間計算量: O(n log n)
- 標準の並べ替えを使用して並べ替えられたコピーを作成します
// indexOf() Array.prototype.myIndexOf = function(searchElement, fromIndex = 0) { const startIndex = fromIndex >= 0 ? fromIndex : Math.max(0, this.length + fromIndex); for (let i = startIndex; i <h3> 20. toSpliced() </h3>
- アルゴリズム: 変更を加えてコピー
- 時間計算量: O(n)
- 変更されたコピーを作成します
// reverse() Array.prototype.myReverse = function() { let left = 0; let right = this.length - 1; while (left <h3> 21.()付き </h3>
- アルゴリズム: 単一の変更を伴う浅いコピー
- 時間計算量: O(n)
- 1 つの要素を変更してコピーを作成します
// sort() Array.prototype.mySort = function(compareFn) { // Implementation of QuickSort for simplicity // Note: Actual JS engines typically use TimSort const quickSort = (arr, low, high) => { if (low { const pivot = arr[high]; let i = low - 1; for (let j = low; j <h3> 22. Array.fromAsync() </h3>
- アルゴリズム: 非同期反復と収集
- 時間計算量: O(n) 非同期操作
- Promise と非同期イテラブルを処理します
// splice() Array.prototype.mySplice = function(start, deleteCount, ...items) { const len = this.length; const actualStart = start 0) { // Moving elements right for (let i = len - 1; i >= actualStart + actualDeleteCount; i--) { this[i + shiftCount] = this[i]; } } else if (shiftCount <h3> 23. Array.of() </h3>
- アルゴリズム: 配列の直接作成
- 時間計算量: O(n)
- 引数から配列を作成します
// at() Array.prototype.myAt = function(index) { const actualIndex = index >= 0 ? index : this.length + index; return this[actualIndex]; };
24. マップ()
- アルゴリズム: 変換反復
- 時間計算量: O(n)
- 変換された要素を含む新しい配列を作成します
// copyWithin() Array.prototype.myCopyWithin = function(target, start = 0, end = this.length) { const len = this.length; let to = target <h3> 25. flatMap() </h3>
- アルゴリズム: マップの平坦化
- 時間計算量: O(n*m) ここで、m はマップされた配列の平均サイズです
- マッピングとフラット化を組み合わせます
// flat() Array.prototype.myFlat = function(depth = 1) { const flatten = (arr, currentDepth) => { const result = []; for (const item of arr) { if (Array.isArray(item) && currentDepth <h3> 26.reduce() </h3>
- アルゴリズム: 線形累積
- 時間計算量: O(n)
- コールバックによる逐次蓄積
// Array.from() Array.myFrom = function(arrayLike, mapFn) { const result = []; for (let i = 0; i <h3> 27.reduceRight() </h3>
- アルゴリズム: 逆線形累積
- 時間計算量: O(n)
- 右から左への累積
// findLastIndex() Array.prototype.myFindLastIndex = function(predicate) { for (let i = this.length - 1; i >= 0; i--) { if (predicate(this[i], i, this)) return i; } return -1; };
28. いくつか()
- アルゴリズム: ショートリニアスキャン
- 時間計算量: O(n)
- 最初の true 条件で停止します
// forEach() Array.prototype.myForEach = function(callback) { for (let i = 0; i <h3> 29.find() </h3>
- アルゴリズム: 線形探索
- 時間計算量: O(n)
- 条件が満たされるまで順次スキャン
// every() Array.prototype.myEvery = function(predicate) { for (let i = 0; i <h3> 30.findIndex() </h3>
- アルゴリズム: 線形探索
- 時間計算量: O(n)
- 一致条件の連続スキャン
// entries() Array.prototype.myEntries = function() { let index = 0; const array = this; return { [Symbol.iterator]() { return this; }, next() { if (index <h3> 31.findLast() </h3>
- アルゴリズム: 逆線形探索
- 時間計算量: O(n)
- 最後から順にスキャン
// concat() Array.prototype.myConcat = function(...arrays) { const result = [...this]; for (const arr of arrays) { for (const item of arr) { result.push(item); } } return result; };
リクエストされた 31 個の配列メソッドすべての完全な実装を提供しました。
? LinkedIn で私とつながりましょう:
一緒にソフトウェア エンジニアリングの世界を深く掘り下げてみましょう!私は、JavaScript、TypeScript、Node.js、React、Next.js、データ構造、アルゴリズム、Web 開発などに関する洞察を定期的に共有しています。スキルを向上させたいと考えている場合でも、エキサイティングなトピックで共同作業したいと考えている場合でも、私はあなたとつながり、一緒に成長したいと思っています。
フォローしてください: ノジブル・イスラム
以上がJavaScript 配列メソッドの背後にあるアルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

このチュートリアルでは、カスタムGoogle検索APIをブログまたはWebサイトに統合する方法を示し、標準のWordPressテーマ検索関数よりも洗練された検索エクスペリエンスを提供します。 驚くほど簡単です!検索をyに制限することができます

楽なWebページレイアウトのためにjQueryを活用する:8本質的なプラグイン jQueryは、Webページのレイアウトを大幅に簡素化します。 この記事では、プロセスを合理化する8つの強力なjQueryプラグイン、特に手動のウェブサイトの作成に役立ちます

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

コアポイント これは通常、メソッドを「所有」するオブジェクトを指しますが、関数がどのように呼び出されるかに依存します。 現在のオブジェクトがない場合、これはグローバルオブジェクトを指します。 Webブラウザでは、ウィンドウで表されます。 関数を呼び出すと、これはグローバルオブジェクトを維持しますが、オブジェクトコンストラクターまたはそのメソッドを呼び出すとき、これはオブジェクトのインスタンスを指します。 call()、apply()、bind()などのメソッドを使用して、このコンテキストを変更できます。これらのメソッドは、与えられたこの値とパラメーターを使用して関数を呼び出します。 JavaScriptは優れたプログラミング言語です。数年前、この文はそうでした

この投稿は、Android、BlackBerry、およびiPhoneアプリ開発用の有用なチートシート、リファレンスガイド、クイックレシピ、コードスニペットをコンパイルします。 開発者がいないべきではありません! タッチジェスチャーリファレンスガイド(PDF) Desigの貴重なリソース

jQueryは素晴らしいJavaScriptフレームワークです。ただし、他のライブラリと同様に、何が起こっているのかを発見するためにフードの下に入る必要がある場合があります。おそらく、バグをトレースしているか、jQueryが特定のUIをどのように達成するかに興味があるからです

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ホットトピック









