目次
Array.from()
小さな整数を使用して配列を作成します:
昇順の整数シーケンスを使用して配列を作成:
:
推荐的模式
提示:一般来说数组的性能无关紧要
ホームページ ウェブフロントエンド jsチュートリアル JavaScript で任意の長さの配列を作成して埋める方法の紹介 (コード付き)

JavaScript で任意の長さの配列を作成して埋める方法の紹介 (コード付き)

Feb 25, 2019 am 10:18 AM
javascript 配列

この記事では、JavaScript で任意の長さの配列を作成して埋める方法を紹介します。必要な方は参考にしていただければ幸いです。

配列を作成する最良の方法は、文字通りの手段を使用することです:

const arr = [0,0,0];
ログイン後にコピー

しかし、これは、大規模な配列を作成する必要がある場合など、長期的な解決策ではありません。このブログ投稿では、この状況で何をすべきかを検討します。

穴のない配列はパフォーマンスが向上する傾向があります

ほとんどのプログラミング言語では、配列は値の連続したシーケンスです。 JavaScript では、配列はインデックスを要素にマップする辞書です。 holes - 要素にマップされていない、ゼロから配列の長さまでのインデックス (「インデックスの欠落」) が含まれる場合があります。たとえば、次の配列にはインデックス 1 に穴があります:

> Object.keys(['a',, 'c'])
[ '0', '2' ]
ログイン後にコピー

穴のない配列は、dense または packed とも呼ばれます。高密度配列は連続して (内部に) 保存できるため、パフォーマンスが向上する傾向があります。ホールが発生すると、内部表現が変更される必要があります。オプションは 2 つあります:

  • Dictionary。検索にはさらに時間がかかり、ストレージのオーバーヘッドが大きくなります。

  • #ホールをマークするための連続データ構造。次に、対応する値がホールであるかどうかを確認します。これにも追加の時間がかかります。

どちらの場合でも、エンジンがホールに遭遇した場合、単に

unknown を返すことはできず、プロトタイプ チェーンを横断して、という名前のホール インデックスを検索する必要があります。 」プロパティの場合、さらに時間がかかります。

V8 などの一部のエンジンでは、パフォーマンスの低いデータ構造に切り替えると、その変更は永続的になります。たとえすべての穴が埋まっても、再び元に戻ることはありません。

V8 が配列を表現する方法の詳細については、Mathias Bynens の記事「V8 の要素タイプ」を参照してください。

配列の作成

Array コンストラクター

指定された長さの配列を作成する場合、一般的な方法は

Array を使用することです。 コンストラクター:

const LEN = 3;
const arr = new Array(LEN);
assert.equal(arr.length, LEN);
// arr only has holes in it
assert.deepEqual(Object.keys(arr), []);
ログイン後にコピー
このメソッドは非常に便利ですが、2 つの欠点があります:

  • 後で配列に値を完全に埋めたとしても、これはメソッドホールにより、この配列もわずかに遅くなります。

  • ホールのデフォルト値は、通常、要素の初期「値」ではありません。一般的なデフォルト値はゼロです。

Array コンストラクター ## の後に .fill() メソッド

.fill()# を追加します。メソッドは現在の配列を変更し、指定された値を入力します。これは、new Array() で配列を作成した後に初期化するのに役立ちます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">const LEN = 3; const arr = new Array(LEN).fill(0); assert.deepEqual(arr, [0, 0, 0]);</pre><div class="contentsignin">ログイン後にコピー</div></div>

警告:

オブジェクトをパラメータとして使用して を埋める場合。 () 配列。すべての要素は同じインスタンスを参照します (つまり、このオブジェクトは複数回複製されていません): <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">const LEN = 3; const obj = {}; const arr = new Array(LEN).fill(obj); assert.deepEqual(arr, [{}, {}, {}]); obj.prop = true; assert.deepEqual(arr,   [ {prop:true}, {prop:true}, {prop:true} ]);</pre><div class="contentsignin">ログイン後にコピー</div></div>後で説明する充填メソッド (

Array. from()

) にはこの問題はありません。

.push()

メソッド <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">const LEN = 3; const arr = []; for (let i=0; i &lt; LEN; i++) { arr.push(0); } assert.deepEqual(arr, [0, 0, 0]);</pre><div class="contentsignin">ログイン後にコピー</div></div>今回は、穴のな​​い配列を作成して埋めました。したがって、この配列の操作は、コンストラクターを使用して作成するよりも高速になるはずです。ただし、配列が大きくなるにつれてエンジンは連続したメモリを複数回再割り当てする必要があるため、

配列の作成は遅くなります。

配列に 未定義

を入力します

Array.from()

イテラブルと配列のような値を配列に変換し、ホールを次のように扱います

未定義要素。このようにして、これを使用して各ホールを 未定義に変換できます。

> Array.from({length: 3})
[ undefined, undefined, undefined ]
ログイン後にコピー
パラメータ {長さ: 3} は、長さが次の配列のようなオブジェクトです。 3、穴だけが含まれています。

new Array(3) を使用することもできますが、これにより通常はより大きなオブジェクトが作成されます。 次のメソッドは反復可能な値にのみ適用され、Array.from() と同様の効果があります:

> [...new Array(3)]
[ undefined, undefined, undefined ]
ログイン後にコピー
But Array.from()Createその結果は

new Array() を介して取得されるため、得られるものは依然としてスパース配列です。 マッピングには Array.from()

を使用します。

2 番目のパラメーターとしてマッピング関数を指定する場合は、Array.from()## を使用できます。 # マッピングを実行します。

配列に値を入力します

小さな整数を使用して配列を作成します:

> Array.from({length: 3}, () => 0)
[ 0, 0, 0 ]
ログイン後にコピー
  • 一意の (非共有) オブジェクト配列:

    > Array.from({length: 3}, () => ({}))
    [ {}, {}, {} ]
    ログイン後にコピー
  • 数値範囲に従って作成

昇順の整数シーケンスを使用して配列を作成:

> Array.from({length: 3}, (x, i) => i)
[ 0, 1, 2 ]
ログイン後にコピー
  • 任意の範囲の整数を使用して作成:

    > const START=2, END=5;
    > Array.from({length: END-START}, (x, i) => i+START)
    [ 2, 3, 4 ]
    ログイン後にコピー
  • 整数の昇順配列を作成する別の方法は、

    .keys()
  • を使用することです。これも空に見えます。 操作は
未定義

です。 要素: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&gt; [...new Array(3).keys()] [ 0, 1, 2 ]</pre><div class="contentsignin">ログイン後にコピー</div></div>.keys()反復可能なシーケンスを返します。それを展開して配列に変換します。

簡単なメモ: 配列を作成します穴で埋めるか、

未定義

:

new Array(3) )
  • [ , , ,]

  • Array.from({length: 2})
    [undefined, undefined]

  • [...new Array(2)]
    [undefined, undefined]

填充任意值:

  • const a=[]; for (let i=0; i<3; i++) a.push(0);
    [0, 0, 0]

  • new Array(3).fill(0)
    [0, 0, 0]

  • Array.from({length: 3}, () => ({}))
    [{}, {}, {}] (唯一对象)

用整数范围填充:

  • Array.from({length: 3}, (x, i) => i)
    [0, 1, 2]

  • const START=2, END=5; Array.from({length: END-START}, (x, i) => i+START)
    [2, 3, 4]

  • [...new Array(3).keys()]
    [0, 1, 2]

推荐的模式

我更喜欢下面的方法。我的侧重点是可读性,而不是性能。

  • 你是否需要创建一个空的数组,以后将会完全填充?

    new Array(LEN)
    ログイン後にコピー
  • 你需要创建一个用原始值初始化的数组吗?

    new Array(LEN).fill(0)
    ログイン後にコピー
  • 你需要创建一个用对象初始化的数组吗?

    Array.from({length: LEN}, () => ({}))
    ログイン後にコピー
  • 你需要创建一系列整数吗?

    Array.from({length: END-START}, (x, i) => i+START)
    ログイン後にコピー

如果你正在处理整数或浮点数的数组,请考虑Typed Arrays —— 它就是为这个目的而设计的。它们不能存在空洞,并且总是用零进行初始化。

提示:一般来说数组的性能无关紧要

  • 对于大多数情况,我不会过分担心性能。即使是带空洞的数组也很快。使代码易于理解更有意义。

  • 另外引擎优化的方式和位置也会发生变化。今天最快的方案可能明天就不是了。

以上がJavaScript で任意の長さの配列を作成して埋める方法の紹介 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

foreach ループを使用して PHP 配列から重複要素を削除するにはどうすればよいですか? foreach ループを使用して PHP 配列から重複要素を削除するにはどうすればよいですか? Apr 27, 2024 am 11:33 AM

foreach ループを使用して PHP 配列から重複要素を削除する方法は次のとおりです。配列を走査し、要素がすでに存在し、現在の位置が最初に出現しない場合は、要素を削除します。たとえば、データベース クエリの結果に重複レコードがある場合、このメソッドを使用してそれらを削除し、重複レコードのない結果を取得できます。

PHP 配列ディープ コピーの技術: さまざまな方法を使用して完璧なコピーを実現する PHP 配列ディープ コピーの技術: さまざまな方法を使用して完璧なコピーを実現する May 01, 2024 pm 12:30 PM

PHP で配列をディープ コピーする方法には、json_decode と json_encode を使用した JSON エンコードとデコードが含まれます。 array_map と clone を使用して、キーと値のディープ コピーを作成します。シリアル化と逆シリアル化には、serialize と unserialize を使用します。

PHP 配列キー値の反転: さまざまな方法のパフォーマンス比較分析 PHP 配列キー値の反転: さまざまな方法のパフォーマンス比較分析 May 03, 2024 pm 09:03 PM

PHP の配列キー値の反転メソッドのパフォーマンスを比較すると、array_flip() 関数は、大規模な配列 (100 万要素以上) では for ループよりもパフォーマンスが良く、所要時間が短いことがわかります。キー値を手動で反転する for ループ方式は、比較的長い時間がかかります。

データソートにおけるPHP配列グループ化機能の応用 データソートにおけるPHP配列グループ化機能の応用 May 04, 2024 pm 01:03 PM

PHP の array_group_by 関数は、キーまたはクロージャ関数に基づいて配列内の要素をグループ化し、キーがグループ名、値がグループに属する要素の配列である連想配列を返すことができます。

PHP 配列のディープ コピーのベスト プラクティス: 効率的な方法を発見する PHP 配列のディープ コピーのベスト プラクティス: 効率的な方法を発見する Apr 30, 2024 pm 03:42 PM

PHP で配列のディープ コピーを実行するためのベスト プラクティスは、 json_decode(json_encode($arr)) を使用して配列を JSON 文字列に変換し、それから配列に戻すことです。 unserialize(serialize($arr)) を使用して配列を文字列にシリアル化し、それを新しい配列に逆シリアル化します。 RecursiveIteratorIterator を使用して、多次元配列を再帰的に走査します。

PHP 配列の多次元ソートの実践: 単純なシナリオから複雑なシナリオまで PHP 配列の多次元ソートの実践: 単純なシナリオから複雑なシナリオまで Apr 29, 2024 pm 09:12 PM

多次元配列のソートは、単一列のソートとネストされたソートに分類できます。単一列のソートでは、array_multisort() 関数を使用して列ごとにソートできますが、ネストされたソートでは、配列を走査してソートするための再帰関数が必要です。具体的な例としては、製品名による並べ替えや、売上数量や価格による化合物の並べ替えなどがあります。

PHP 配列のマージおよび重複排除アルゴリズム: 並列ソリューション PHP 配列のマージおよび重複排除アルゴリズム: 並列ソリューション Apr 18, 2024 pm 02:30 PM

PHP 配列のマージおよび重複排除アルゴリズムは、元の配列を小さなブロックに分割して並列処理する並列ソリューションを提供し、メイン プロセスは重複排除するブロックの結果をマージします。アルゴリズムのステップ: 元の配列を均等に割り当てられた小さなブロックに分割します。重複排除のために各ブロックを並行して処理します。ブロックの結果をマージし、再度重複排除します。

重複要素の検索における PHP 配列グループ化関数の役割 重複要素の検索における PHP 配列グループ化関数の役割 May 05, 2024 am 09:21 AM

PHP の array_group() 関数を使用すると、指定したキーで配列をグループ化し、重複する要素を見つけることができます。この関数は次の手順で動作します。 key_callback を使用してグループ化キーを指定します。必要に応じて、value_callback を使用してグループ化値を決定します。グループ化された要素をカウントし、重複を特定します。したがって、array_group() 関数は、重複する要素を見つけて処理するのに非常に役立ちます。

See all articles