Javascript Array.map不';似乎无法在未初始化的数组上工作
我正在尝试使用map函数在未初始化的数组上设置默认值,但它似乎不起作用,关于如何设置默认值有什么想法吗 考虑一下我在Chrome控制台中尝试的这个代码片段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。函数跳过从未赋值的条目。因此,在像您这样的新构造的数组上,它实际
> 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) 让
bePk
ToString(k)
- b) 让
成为使用参数kPresent
调用Pk
的[[HasProperty]]内部方法的结果O
- c) 如果
为kPresent
,则true
- 施展魔法
- a) 让
新数组(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]