将Array.map与新的Array构造函数一起使用

时间:2016-05-27 15:46:02

标签: javascript arrays map-function

我试图将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 ) );

所以我的问题。使用地图功能有更好/更好的方法吗?

提前致谢!

5 个答案:

答案 0 :(得分:6)

您可以使用Array#from创建一个已通过长度的数组。

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

答案 1 :(得分:4)

Section 22.1.3.15的{p {3}}在NOTE 1的最后一行找到了你:

  仅对实际存在的数组元素调用

callbackfn ;它不会被称为缺少数组的元素。

此行为由filterforEach和其他功能方法共享。

您从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)

您可以将Arrayapply与其中包含长度的对象一起使用。

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

答案 4 :(得分:3)

如果我没弄错的话,你明确表示你想要一个 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
  4. PS:您甚至可以跳过new关键字并执行:

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