簡體   English   中英

將 Array.map 與新的 Array 構造函數一起使用

[英]Using Array.map with new Array constructor

我試圖將new Array()構造函數與map一起使用,以創建一個創建元素列表的單行代碼。 像這樣的東西:

 let arr = new Array(12).map( (el, i) => { console.log('This is never called'); return i + 1; });

閱讀文檔,這種行為是有道理的。

基本上文檔說,即使對於數組中聲明的未定義值,也會執行 map 的回調,但例如在像之前的代碼一樣創建空數組時不會執行。

所以這應該有效:

 var arr = new Array(12); for(let i = 0; i < arr.length ; i++){ arr[i] = undefined; } let list = arr.map( (e, i) => { console.log(i + 1); return i + 1; });

所以,我們也可以這樣做:

 let newArray = (length) => { let myArray = new Array(length); for(let i = 0; i < length; i++) myArray[i] = undefined; return myArray; }; console.log( newArray(12).map( (el, i) => i + 1 ) );

所以我的問題。 有沒有更好/漂亮的方法來使用地圖功能?

提前致謝!

您可以使用Array#from創建具有傳遞長度的數組。

Array.from({length: 12}, (e, i) => i + 1);

如果我沒記錯的話,您明確表示您想要使用new Array構造函數的答案。

這是如何做到的。 一行,漂亮的 ES6:

let me = [...new Array(5)].map((x,i)=>i)
// [0,1,2,3,4]

解釋:

  1. new Array(5)生成: [ , , , , ]​​​​​
  2. [...new Array(5)]Array.from(new Array(5))的簡寫,生成如下: ​​​​​[ undefined, undefined, undefined, undefined, undefined ]​​​​​ ,這是一個undefined對象的數組。 是的, undefined是一個值(原始值 :))。
  3. 現在我們可以迭代我們全新數組的值:D

PS:您甚至可以跳過new關鍵字並執行以下操作:

[...Array(5)].map((x,i)=>i)

額外:最簡潔的表達

[...Array(5).keys()] // [ 0, 1, 2, 3, 4 ]

規范第 22.1.3.15 節為您提供了NOTE 1的最后一行:

callbackfn僅對實際存在的數組元素調用; 它不需要數組的缺失元素。

此行為由filterforEach和其他函數方法共享。

您正在調用的數組構造函數Array(len)來自第 22.1.1.2 節,它將設置數組的長度,但不會初始化元素。 我不確定規范在哪里定義了缺少的元素,但是new Array(len)生成的數組應該適合它,因此map不會觸及任何元素。

我喜歡這種方法,因為它在 ES5 中仍然有效:

let arr = Array.apply(null, Array(12))
    .map(function (x, i) {
        return i
    });

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

由於New Array返回一個包含“holes”的數組,我們使用 apply 因為 apply 將洞視為未定義。 這將 undefined 擴展到整個數組,使其可映射。

你可以使用Array apply於其中包含長度的對象。

 var array = Array.apply(null, { length: 12 }).map((_, i) => i + 1); console.log(array);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM