[英]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]
解釋:
new Array(5)
生成: [ , , , , ]
[...new Array(5)]
是Array.from(new Array(5))
的簡寫,生成如下: [ undefined, undefined, undefined, undefined, undefined ]
,這是一個undefined
對象的數組。 是的, undefined
是一個值(原始值 :))。 PS:您甚至可以跳過new
關鍵字並執行以下操作:
[...Array(5)].map((x,i)=>i)
額外:最簡潔的表達
[...Array(5).keys()] // [ 0, 1, 2, 3, 4 ]
規范的第 22.1.3.15 節為您提供了NOTE 1
的最后一行:
callbackfn僅對實際存在的數組元素調用; 它不需要數組的缺失元素。
此行為由filter
、 forEach
和其他函數方法共享。
您正在調用的數組構造函數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 擴展到整個數組,使其可映射。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.