我试图将new Array()
构造函数与map
一起使用,以创建一个创建元素列表的单行代码。像这样:
let arr = new Array(12).map( (el, i) => {
console.log('This is never called');
return i + 1;
});
阅读docs,行为是有道理的。
基本上文档说即使对于数组中声明的未定义值,也会执行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 ) );
所以我的问题。使用地图功能有更好/更好的方法吗?
提前致谢!
答案 0 :(得分:6)
您可以使用Array#from
创建一个已通过长度的数组。
Array.from({length: 12}, (e, i) => i + 1);
答案 1 :(得分:4)
NOTE 1
的最后一行找到了你:
仅对实际存在的数组元素调用callbackfn ;它不会被称为缺少数组的元素。
此行为由filter
,forEach
和其他功能方法共享。
您从the spec调用的数组构造函数Array(len)
将设置数组的长度,但不会初始化元素。我不确定规范在哪里定义缺少的元素是什么,但是new Array(len)
生成的数组应该适合它,因此map
不会触及任何元素。
答案 2 :(得分:3)
我喜欢这种方法,因为它仍适用于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
返回一个包含&#34; holes&#34;的数组,因此我们使用apply,因为apply会将孔视为未定义。这在整个数组中传播未定义,使其可以映射。
答案 3 :(得分:3)
您可以将Array
。apply
与其中包含长度的对象一起使用。
var array = Array.apply(null, { length: 12 }).map((_, i) => i + 1);
console.log(array);
&#13;
答案 4 :(得分:3)
如果我没弄错的话,你明确表示你想要一个 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)