有没有更简洁的方法来进行这种初始化?
for (var i = 0; i < arraySize; i++) array[i] = value;
答案 0 :(得分:91)
这样做的一个简短方法是:
var arr = Array(arraySize).fill(value);
例如arr = Array [ 0, 0, 0, 0, 0 ]
和arraySize == 5
会value == 0
。
答案 1 :(得分:36)
while(arraySize--) array.push(value);
没有初始化(我知道)
<强>更新强>
自从4年前发布这个答案以来,人们似乎不断回到这里寻求答案。出于基准测试的目的,我使用了一些不同的解决方案 JSPerf 。
上面的解决方案并不是最快的,尽管它很短。坚持同样的短款式,但性能更好:
while(size--) array[size] = value;
2016年2月更新 使用包含更多测试用例的新修订更新了JSPerf。
如果表现无关紧要,你想要一个单行:
var value = 1234, // can be replaced by a fixed value
size = 1000, // can be replaced by a fixed value
array = Array.apply(null,{length: size}).map(function() { return value; });
更高性能的解决方案(在一个,脏,行): 请注意:这将替换范围
中存在的值,大小和i变量for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value;
答案 2 :(得分:9)
function initArray(length, value) {
var arr = [], i = 0;
arr.length = length;
while (i < length) { arr[i++] = value; }
return arr;
}
var data = initArray(1000000, false);
答案 3 :(得分:7)
这不是那么紧凑,但可以说更直接。
array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
答案 4 :(得分:5)
这可能不比上述任何技术更好,但它很有趣......
var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})
答案 5 :(得分:4)
这是一个古老的问题,但是我在现代JS中使用它:
[...new Array(1000000)].map(()=>42);
答案 6 :(得分:2)
为了提高效率,我会避免push
。所以简单地
for (var i = 0; i < arraySize; i++) array[i] = value;
对于IE10:
array = new Array(arraySize);
for (var i = 0; i < arraySize; i++) array[i] = value;
编辑:修改,如评论中所述。
答案 7 :(得分:1)
如果你需要多次这样做,你总是可以写一个函数:
function makeArray(howMany, value){
var output = [];
while(howMany--){
output.push(value);
}
return output;
}
var data = makeArray(40, "Foo");
而且,只是为了完整性(摆弄内置对象的原型通常不是一个好主意):
Array.prototype.fill = function(howMany, value){
while(howMany--){
this.push(value);
}
}
所以你现在可以:
var data = [];
data.fill(40, "Foo");
更新:我刚刚看到你关于arraySize
是常数或字面值的说明。如果是这样,只需将所有while(howMany--)
替换为旧的for(var i=0; i<howMany; i++)
。
答案 8 :(得分:0)
在飞机上探索阵列方法时偶然发现了这个问题。哦,当我们感到无聊时,我们去的地方。 :)
var initializedArray = new Array(30).join(null).split(null).map(function(item, index){
return index;
});
赢得 .map()
和null
!我喜欢null,因为传递一个像'0'或任何其他值的顶部字符串是令人困惑的。我认为这更明确我们正在做一些不同的事情。
请注意.map()
会跳过未初始化的值。这就是new Array(30).map(function(item, index){return index});
不起作用的原因。如果可用,则首选新的.fill()
方法,但应在 2015年8月23日时注明浏览器支持。
桌面(基本支持)
来自MDN:
[1, 2, 3].fill(4); // [4, 4, 4]
[1, 2, 3].fill(4, 1); // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2); // [1, 4, 3]
[1, 2, 3].fill(4, 1, 1); // [1, 2, 3]
[1, 2, 3].fill(4, -3, -2); // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN); // [1, 2, 3]
Array(3).fill(4); // [4, 4, 4]
[].fill.call({ length: 3 }, 4); // {0: 4, 1: 4, 2: 4, length: 3}
答案 9 :(得分:0)
我认为这很好,简短而优雅:
// assuming `value` is what you want to fill the array with
// and `arraySize` is the size of the array
Array(arraySize).fill(value);