目錄
建立陣列
Array 建構子後面加上.fill() 方法
undefined 填滿陣列
推荐的模式
提示:一般来说数组的性能无关紧要
首頁 web前端 js教程 JavaScript中建立和填入任意長度的陣列方法介紹(附程式碼)

JavaScript中建立和填入任意長度的陣列方法介紹(附程式碼)

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

這篇文章帶給大家的內容是關於JavaScript中創建和填充任意長度的陣列方法介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

創建數組的最佳方法是透過字面方式:

const arr = [0,0,0];
登入後複製

不過這並不是長久之計,例如當我們需要創建大型數組時。這篇文章探討了在這種情況下該怎麼做。

沒有空洞的陣列往往表現得更好

在大多數程式語言中,陣列是連續的值序列。在 JavaScript 中,Array 是一個將索引對應到元素的字典。它可以存在空洞(holes) —— 零和陣列長度之間的索引沒有映射到元素(「缺失索引」)。例如,下面的 Array 在索引 1 處有一個空洞:

> Object.keys(['a',, 'c'])
[ '0', '2' ]
登入後複製

沒有空洞的陣列也稱為 dense  packed。密集數組往往表現更好,因為它們可以連續儲存(內部)。一旦出現了空洞,內部表示就必須改變。我們有兩種選擇:

  • 字典。查找時會消耗更多時間,而且儲存開銷更大。

  • 連續的資料結構,對空洞進行標記。然後檢查對應的值是否是一個空洞,這也需要額外的時間。

不管是哪一種情況,如果引擎遇到一個空洞,它不能只回傳undefined,它必須遍歷原型鏈並蒐索一個名稱為「空洞索引”的屬性,這需要花費更多時間。

在某些引擎中,例如V8,如果切換到效能較低的資料結構,這種改變將會是永久性的。即使所有空洞都被填補,它們也不會再切換回來了。

關於 V8 是如何表示陣列的,請參閱Mathias Bynens的文章「V8中的元素類型」。

建立陣列

Array 建構子

#如果要建立具有給定長度的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), []);
登入後複製

這種方法很方便,但有兩個缺點:

  • 即使你稍後再用值把陣列完全填滿,這種空洞也會使這個Array 略微變慢。

  • 空洞的預設值一般不會是元素的初始「值」。常見的預設值是零。

Array 建構子後面加上.fill() 方法

##.fill()方法會更改目前的Array 並使用指定的值去填充它。這有助於在用new Array() 建立陣列後對其進行初始化:

const LEN = 3;
const arr = new Array(LEN).fill(0);
assert.deepEqual(arr, [0, 0, 0]);
登入後複製

警告:如果你用物件作為參數去. fill() 一個數組,所有元素都會引用同一個實例(也就是這個物件沒有被克隆多份):

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} ]);
登入後複製
稍後我們會遇到的一種填充方法(

Array.from() )則沒有這個問題。

.push() 方法
const LEN = 3;
const arr = [];
for (let i=0; i < LEN; i++) {
  arr.push(0);
}
assert.deepEqual(arr, [0, 0, 0]);
登入後複製

這次,我們建立並填滿了一個陣列,同時裡面沒有出現漏洞。所以操作這個陣列時應該比用建構函式創建的更快。不過

建立 陣列的速度比較慢,因為引擎可能需要隨著陣列的成長多次重新分配連續的記憶體。

使用

undefined 填滿陣列

Array.from() 將iterables 和類似陣列的值轉換為Arrays ,它將空洞視為undefined 元素。這樣可以用它將每個空洞轉換為undefined

> Array.from({length: 3})
[ undefined, undefined, undefined ]
登入後複製
參數

{length:3} 是長度為3 的類似Array 的對象,其中只包含空洞。也可以使用 new Array(3),但這樣一般會建立更大的物件。 下面這種方式僅適用於可迭代的值,並且與
Array.from()具有類似的效果:

> [...new Array(3)]
[ undefined, undefined, undefined ]
登入後複製
不過

Array.from()透過new Array() 來建立它的結果,所以你得到的仍然是一個稀疏數組。

使用 

Array.from()  進行映射

#如果提供映射函數作為其第二個參數,則可以使用

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(),它也將空洞看作是undefined 元素:

> [...new Array(3).keys()]
[ 0, 1, 2 ]
登入後複製

.keys()傳回一個可迭代的序列。我們將其展開並轉換為數組。

備忘速查:建立陣列

用空洞或

undefined填入:

  • 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

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數組多維排序實戰:從簡單到複雜場景 Apr 29, 2024 pm 09:12 PM

多維數組排序可分為單列排序和嵌套排序。單列排序可使用array_multisort()函數依列排序;巢狀排序需要遞歸函數遍歷陣列並排序。實戰案例包括按產品名稱排序和按銷售量和價格複合排序。

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 陣列分組函數在尋找重複元素中的作用 May 05, 2024 am 09:21 AM

PHP的array_group()函數可用來按指定鍵對陣列進行分組,以尋找重複元素。函數透過以下步驟運作:使用key_callback指定分組鍵。可選地使用value_callback確定分組值。對分組元素進行計數並識別重複項。因此,array_group()函數對於尋找和處理重複元素非常有用。

PHP 數組合併去重演算法:平行的解決方案 PHP 數組合併去重演算法:平行的解決方案 Apr 18, 2024 pm 02:30 PM

PHP數組合併去重演算法提供了平行的解決方案,將原始陣列分成小塊並行處理,主進程合併區塊的結果去重。演算法步驟:分割原始數組為均等分​​配的小塊。並行處理每個區塊去重。合併區塊結果並再次去重。

See all articles