Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Array.map不';似乎无法在未初始化的数组上工作_Javascript_Arrays - Fatal编程技术网

Javascript Array.map不';似乎无法在未初始化的数组上工作

Javascript Array.map不';似乎无法在未初始化的数组上工作,javascript,arrays,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。函数跳过从未赋值的条目。因此,在像您这样的新构造的数组上,它实际

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

考虑一下我在Chrome控制台中尝试的这个代码片段

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

> x.map(function(i) { return 0;});
  [undefined x 10]
我希望数组初始化为0。

函数跳过从未赋值的条目。因此,在像您这样的新构造的数组上,它实际上什么都不做

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

根据第15.4.4.19节:

callbackfn仅对实际 存在;对于数组中缺少的元素,不会调用它


如果要填充数组,可以使用
array(5).fill()
,然后这些方法将按预期工作——请参阅aasha7中的备选相关答案。较旧的预填充方法包括:

Array.apply(null, new Array(5)).map(function() { return 0; });
// [ 0, 0, 0, 0, 0 ]
经过一番阅读,我发现这也可以写成

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
将跳过未定义的值:(

您可以用零填充数组:

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

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]

ECMAScript语言规范就是这样描述的

下面是
Array.prototype.map
的相关部分,如()

  • 8.在
    k
    • a) 让
      Pk
      be
      ToString(k)
    • b) 让
      kPresent
      成为使用参数
      Pk
      调用
      O
      的[[HasProperty]]内部方法的结果
    • c) 如果
      kPresent
      true
      ,则
      • 施展魔法
由于数组中没有初始化成员,因此调用例如
新数组(1337)。hasOwnProperty(42)
的计算结果为
false
,因此不满足步骤8.c中的条件

不过,您可以使用一点“黑客”来做您想要做的事情

Array.apply(null,{length:5}).map(Number.call,Number)/[0,1,2,3,4]


这是如何运作的,经过深思熟虑

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

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

这将返回
[4,4]

基于先前的答案,有了新的较短语法。OP希望创建一个由N个项组成的数组,这些项用0初始化

var N = 10;
var x = new Array(N).fill(0);
// x is now: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
您也不需要新的
——在本上下文中它是可选的


检查和/或使用pollyfill(如果不可用)。

也可以使用不带
阵列的解决方案。原型。填充

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

+1; 这里的问题是,
map
跳过从未赋值的索引。将
Object.keys(新数组(2))
(无可枚举属性)与
Object.keys([undefined,undefined])
(两个可枚举属性,
0
1
)。在第一种情况下,数组没有分配给任何索引的值;在第二种情况下,索引
0
1
已分配值
undefined
@apsillers,您是正确的。为了澄清,var x=新数组(5)
只有
x.length==5
数组。prototype
。除此之外,没有设置可枚举键。非常酷的技巧-我仍在试图理解“新数组(5)”和“数组”之间的区别。apply(null,新数组(5))“@Raja你应该完全检查一下,我遇到了这个问题,它实际上对
未定义的
值起作用(在javascript类型中未定义),只是不在未初始化的值上。
new
null
不是必需的,这对相同的
数组(10.fill().map(=>0)
有效+1或更短的
数组(10)。填充(0)
[…数组(2)]。映射(=>4)
[...Array(10)].map((_, idx) => idx); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]