jsで配列を素早く初期化する方法
タグ (スペースで区切られています): apply
バージョンに注意してください
コードを書くとき、通常、配列を素早く初期化する必要があります。たとえば、zeros
に似た関数が必要です。ここで必要な場合は、1 日 24 時間を表す 0 ~ 23 の配列を生成します。 zeros
函数,假如这里我们需要生成一个0-23的数组用于表示一天24小时。
最基本的做法如下:
function(){ let hours = []; for(let k = 0; k < 24; k++ ) hours.push(k); return hours; }
下面我们来思考如何用更优雅的方式实现。
考虑使用new Array(24)
+ map
的方法来实现。
代码如下:
Array(24).map((_, h) => h);
注意,这里map
的第二个参数是索引,平时用的少,这里把索引作为数值。
结果与预期并不符合,为啥呢?
简单搜索了一下,发现时因为js里的稀疏数组的逻辑导致的。
我们先看一下下面的代码:
let a = []; a[1000] = 2; console.log(a.length);// 1000a.forEach(x => console.log("hello"));// only one "hello"
js的处理逻辑是,对于没有主动赋值的位置进行“空置”处理,对于这些“空置”未知,迭代器是不会理会的,这么做最主要的目的就是避免不合理的赋值操作导致的bug。
假设没有这种逻辑,我们写下了new Array(Date.now())
,这将导致系统新建一个非常大的数组,而实际上啥也没存。
我们可以吧new Array(len)
干的事情简单理解为下面的过程:
function(len){ let r = []; r.length = len; return r;
这就是为什么对new Array(len)
调用map
或者forEach
的时候跟预期不一致了。
如何解决这一问题呢,除了使用new Array(len)
的形式,我们还可以使用new Array(1,2,3)
这种写法来初始化数组,但是这么写就没法实现我们编写初始化数组的目的了。
这个时候我们想到了apply
,这个函数的第二个参数正好就是一个数组,于是我们写下了下面的代码。
// 借用apply Array.apply(null, Array(24)).map((_, h) => h); // [0, 1, ..., 24]
得到了我们希望的结果。这就说明,Array(24)
在apply
中作为参数的时候是被当做24个值对待的,因为这一点就保证了最后得到的数组长度是24。
既然如此,我们当然同样可以使用apply
的姊妹函数call
。
// 借用call Array.call(null, ...Array(24)).map((_, h) => h); // [0, 1... 23]
这也更确认了一件事,Array(len)
解构会得到len
个参数而非一个参数,当然call
的使用必须在支持解构操作符的环境中。
在熟悉了call
和apply
的原理后,我们可以进一步写出下面的代码:
// Array本身 Array(...Array(24)).map((_, h) => h); // [0, 1, ..., 24]
这种形式已经足够优雅了。
另外,在ES6
中,Array
提供了新方法fill
,借用该方法填充那些“空置”位,进而保证后续的操作能顺利进行。
具体代码如下:
// 推荐 Array(24).fill(null).map((_, h) => h);
现在也比较推荐最后一种写法,这种方法也最为直观。
不过需要注意fill
最も基本的なアプローチは次のとおりです:
// no-fillconsole.time("no-fill");let t = Array(5e7);console.timeEnd("no-fill");// fillconsole.time("fill");let q = Array(5e7).fill(null);console.timeEnd("fill");// => no-fill: 0.240ms// => fill: 3247.921ms
これを実現するには、new Array(24)
+ map
メソッドの使用を検討してください。
map
の 2 番目のパラメータはインデックスですが、ここではインデックスが数値として使用されていることに注意してください。 🎜結果が期待と一致しません。なぜですか? 🎜簡単に検索したところ、js の疎配列のロジックが原因であることがわかりました。 🎜まず次のコードを見てみましょう: 🎜rrreee🎜 js の処理ロジックは、値がアクティブに割り当てられていない位置の「空席」を処理することです。これらの不明な「空席」については、イテレーターは処理しません。最も重要なことは、これを行うことです。目的は、無理な代入操作によって引き起こされるバグを回避することです。 🎜そのようなロジックはなく、new Array(Date.now())
を記述するとします。これにより、システムは非常に大きな配列を作成しますが、実際には何も保存されません。 🎜new Array(len)
が何を行うのかは、次のプロセスのように簡単に理解できます: 🎜rrreee🎜これが、map が <code>new Array(len)
で呼び出される理由です。 /code> または forEach
は期待と一致しません。 🎜この問題を解決するには、new Array(len)
を使用する以外に、new Array(1,2,3)
を使用して配列を初期化することもできます。この方法では、初期化された配列を書き込むという目的は達成されません。 🎜今回は apply
を考えましたが、この関数の 2 番目のパラメータは配列であるため、次のコードを書きました。 🎜rrreee🎜期待通りの結果が得られました。これは、Array(24)
が apply
のパラメータとして使用される場合、24 個の値として扱われることを意味します。これにより、最終的な配列の長さが 24 になることが保証されます。 🎜この場合、もちろん apply
の姉妹関数 call
も使用できます。 🎜rrreee🎜 これは、Array(len)
の分解では 1 つのパラメータではなく len
パラメータを取得することも確認しています。もちろん、call
は必要です構造化演算子をサポートする環境で使用できます。 🎜🎜 call
と apply
の原則に慣れたら、さらに次のコードを書くことができます: 🎜rrreee🎜 このフォームは十分にエレガントです。 🎜さらに、ES6
では、Array
は新しいメソッド fill
を提供します。これを使用して、これらの「空き」ビットを埋めて、その後の動作を保証できます。スムーズに操作を進めることができます。 🎜具体的なコードは次のとおりです: 🎜rrreee🎜 ここで、最も直観的な最後の書き方もお勧めします。 🎜 ただし、fill
メソッドの使用に注意する必要があり、ブラインドフィルは避けるようにしてください。これは、JS の「空」ロジックが設計されているという上記のバグを引き起こすためです。避けるために。 🎜興味がある場合は、次のコードを試してみてください: 🎜rrreee🎜 ブラウザで試してみると、ブラウザは基本的に応答しません。結果が得られないように、より大きな値を設定しませんでした。 int が 4 バイトのメモリを占有すると仮定すると、この fill は 200M のメモリを占有し、5,000 万回ループする必要があります。これは必然的に大量の CPU とメモリを占有することになりますが、これはシングルスレッドの JS では絶対に許可されません。 🎜🎜🎜以上がjsで配列を素早く初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











解決策: 1. アプリケーションを再インストールします; 2. DLL を修復または再インストールします; 3. システムの復元またはチェックポイントの回復; 4. システム ファイル チェッカー (SFC) を使用してスキャンします; 5. スタートアップ項目とサービスを確認します; 6. ツールを使用します; 7.公式ドキュメントやフォーラムを確認する; 8. セキュリティ ソフトウェアを検討する; 9. イベント ビューアを確認する; 10. 専門家の助けを求めるなど。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

win7 システムは非常に優れた高性能システムであり、win7 を継続的に使用していると、多くの友人が win7 でコンピュータを初期化する方法を尋ねてきます。今日は、エディターが win7 コンピューターの工場出荷時の設定を復元する方法を紹介します。 win7 でコンピュータを初期化する方法に関する関連情報: 画像とテキストによる詳細な手順 手順: 1. 「スタート メニュー」を開いて入ります。 2. 左側の下部をクリックして設定を入力します。 3. Win10 の更新と回復の設定インターフェイスで、選択します。 4. 以下の「すべてのコンテンツを削除して Windows を再インストールする」をクリックします。 5. 以下の「初期化」設定が表示されるので、クリックします。 6. 「コンピュータには複数のドライブがあります」設定オプションを入力します ここには 2 つのオプションがあり、状況に応じて選択できます。

SpringBoot と SpringMVC を比較し、その違いを理解する Java 開発の継続的な発展に伴い、Spring フレームワークは多くの開発者や企業にとって最初の選択肢となっています。 Spring エコシステムでは、SpringBoot と SpringMVC の 2 つの非常に重要なコンポーネントです。どちらも Spring フレームワークをベースにしていますが、機能や使用方法にいくつかの違いがあります。この記事では、SpringBoot と Spring の比較に焦点を当てます。

win7 システムは非常に優れた高性能システムです。最近、多くの win7 システムの友人が win7 のネットワーク設定を初期化する方法を探しています。今日は、エディターが win7 コンピュータのネットワーク初期化の詳細を紹介します。見てみましょう。チュートリアルを見てください。 win7 でネットワーク設定を初期化する方法に関する詳細なチュートリアル: グラフィカルな手順: 1. [スタート] メニューをクリックし、[コントロール パネル] を見つけて開き、[ネットワークと共有センター] をクリックします。 2. 次に、「アダプターデバイスの変更」を見つけてクリックします。 3. 次に、開いたウィンドウで「ローカル エリア接続」を右クリックし、「プロパティ」をクリックします。 4. 開いたら、「インターネット プロトコル バージョン (TCP/IPv4)」を見つけてダブルクリックします。

多くのゲーマーは、ゲームがグラフィックス システムの初期化に失敗するというイライラする問題に遭遇したことがあります。この記事では、この問題の背後にある一般的な理由を詳しく掘り下げ、すぐにボードに戻ってレベルをクリアできるシンプルかつ効果的な解決策を見つけます。したがって、Rollercoaster Tycoon、Assassin’s Creed、Tony Hawk’s Pro Skater などで「グラフィック システムを初期化できません」というエラー メッセージが表示される場合は、この記事で説明されている解決策に従ってください。初期化エラー グラフィックス システムを初期化できません。グラフィックカードはサポートされていません。グラフィックス システムを初期化できないエラー メッセージを修正する Rollercoaster Tycoon、Assassin's Creed、Tony Hawk's Pro Skater などのゲームでのグラフィックス システムを初期化できないエラー メッセージを解決するには、次の回避策を試すことができます。互換モード

Win11 の「マイ コンピュータ」パスの違いは何ですか?すぐに見つけられる方法! Windows システムは常に更新されているため、最新の Windows 11 システムにもいくつかの新しい変更と機能が追加されています。よくある問題の 1 つは、Win11 システムでユーザーが「マイ コンピューター」へのパスを見つけられないことですが、これは通常、以前の Windows システムでは簡単な操作でした。この記事では、Win11 システムでの「マイ コンピュータ」のパスの違いと、それらをすばやく見つける方法を紹介します。 Windows1の場合

WordPress Web サイト構築ガイド: 個人用 Web サイトを素早く構築する デジタル時代の到来により、個人用 Web サイトを持つことが流行し、必要なものになりました。最も人気のある Web サイト構築ツールである WordPress を使用すると、個人の Web サイトをより簡単かつ便利に構築できます。この記事では、具体的なコード例を含め、個人用 Web サイトをすばやく構築するためのガイドを提供します。自分の Web サイトを持ちたいと考えている友人の助けになれば幸いです。ステップ 1: ドメイン名とホスティングを購入する 個人 Web サイトの構築を始める前に、まず独自の Web サイトを購入する必要があります
