我正在尝试使用map函数在未初始化的数组上设置默认值,但它似乎不起作用,有关如何设置默认值的任何想法?
请考虑我在Chrome控制台中尝试过的代码段。
> var N = 10;
> var x = new Array(N);
> x
[undefined x 10]
> x.map(function(i) { return 0;});
[undefined x 10]
我期待数组被初始化为0。
答案 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)所述
k < len
Pk
为ToString(k)
。kPresent
成为使用参数O
调用[{1}}的[[HasProperty]]内部方法的结果。Pk
是kPresent
,那么
由于数组中没有已启动的成员,因此调用例如true
的计算结果为new Array (1337).hasOwnProperty (42)
,因此不满足步骤8.c中的条件。
然而,您可以使用一点“黑客”来做你想做的事。
false
这是如何运作的explained by @Zirak
答案 3 :(得分:1)
.map()
功能会跳过从未分配过值的条目。因此,在像你这样的新构造的阵列上,它基本上没有任何作用。
答案 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]
答案 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]