Array.map似乎不适用于未初始化的数组

时间:2013-12-02 16:57:34

标签: javascript arrays

我正在尝试使用map函数在未初始化的数组上设置默认值,但它似乎不起作用,有关如何设置默认值的任何想法?

请考虑我在Chrome控制台中尝试过的代码段。

> var N = 10;
> var x = new Array(N);
> x
  [undefined x 10]

> x.map(function(i) { return 0;});
  [undefined x 10]

我期待数组被初始化为0。

8 个答案:

答案 0 :(得分:25)

如果您想填充数组,可以使用Array(5).fill(),然后这些方法将按预期工作 - 请参阅aasha7的备用相关答案。较早的预填方法包括:

Array.apply(null, new Array(5)).map(function() { return 0; });
// [ 0, 0, 0, 0, 0 ]

在阅读了posts linked in the comments之一后,我发现这也可以写成

Array.apply(null, {length: 5}).map(function() { return 0; });

但是,尝试在未定义的值上使用.map将无效。

x = new Array(10);
x.map(function() { console.log("hello"); });

// so sad, no "hello"
// [ , , , , , , , , ,  ]

.map将跳过未定义的值:(

答案 1 :(得分:7)

我只想指出你现在可以做到:

Array(2).fill().map(_ => 4);

这将返回[4, 4]

答案 2 :(得分:3)

这就是ECMAScript语言规范所描述的方式

以下是Array.prototype.map的相关部分,如(§15.4.4.19)所述

  • ...
  • 8 。重复,同时k < len
    • a)PkToString(k)
    • b)kPresent成为使用参数O调用[{1}}的[[HasProperty]]内部方法的结果。
    • c)如果PkkPresent,那么
      • 做魔术
  • ...

由于数组中没有已启动的成员,因此调用例如true的计算结果为new Array (1337).hasOwnProperty (42),因此不满足步骤8.c中的条件。

然而,您可以使用一点“黑客”来做你想做的事。

false

这是如何运作的explained by @Zirak

答案 3 :(得分:1)

.map()功能会跳过从未分配过值的条目。因此,在像你这样的新构造的阵列上,它基本上没有任何作用。

Here is the MDN description.

答案 4 :(得分:1)

使用.map()时,将跳过未定义的元素并且不会将其传递给回调,因此如果您的数组中没有实际包含任何内容的元素,则永远不会调用回调。

来自ECMA script 262, 5.1 specification,第15.4.4.19节:

  

仅对实际的数组元素调用callbackfn   存在;它不会被称为缺少数组的元素。

答案 5 :(得分:1)

您可以使用零using this function填充数组:

function fillArrayWithNumber(n) {
  var arr = Array.apply(null, Array(n));
  return arr.map(function (x, i) { return 0; });
}

fillArrayWithNumber(5); // [0,0,0,0,0]

或者只需稍加更改即可使用索引:

function fillArrayWithIndex(n) {
  var arr = Array.apply(null, Array(n));
  return arr.map(function (x, i) { return i; });
}

fillArrayWithIndex(5); // [0,1,2,3,4]

Fiddle

答案 6 :(得分:1)

基于之前的答案,有一种新的更短的语法。 OP想要创建一个用0初始化的N个项目数组。

var N = 10;
var x = new Array(N).fill(0);
// x is now: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

您也不需要new - 在此上下文中它是可选的。

检查compatibility of your target platform和/或使用pollyfill(如果不可用)。

答案 7 :(得分:1)

没有Array.prototype.fill的可能解决方案:

[...Array(10)].map((_, idx) => idx); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]