for (var i = 0; i < arraySize; i++) array[i] = value;
var arr = Array(arraySize).fill(value);
例如,如果
arr = Array [ 0, 0, 0, 0, 0 ]
和
arraySize == 5
,例如。
value == 0
没有初始化(我知道)jsperf
。上面的解决方案不是最快的,尽管它很短。坚持相同的短风格,但性能更好:
while(arraySize--) array.push(value);
Update2016年2月 使用更多的测试柜更新了jsperf。
如果表现无关紧要,您想要一个单线:while(size--) array[size] = value;
有更多的性能解决方案(一,肮脏,线):
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; });
这个是一个古老的问题,但我在现代JS中使用它:
for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value;
在一次性的情况下,OP似乎是紧凑的,而不是效率和可重复性。对于寻求效率的其他人来说,这是尚未提及的优化。由于您知道预先的数组的长度,请在分配值之前继续进行设置。否则,阵列将随时反复调整大小 - 不是理想的!
这不是紧凑,但可以说是更直接的。
function initArray(length, value) {
var arr = [], i = 0;
arr.length = length;
while (i < length) { arr[i++] = value; }
return arr;
}
var data = initArray(1000000, false);
这不太可能比上面的任何技术都好,但它很有趣...
array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
您可以使用JS数组构造函数:
var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})
const arr = new Array(3)
)
SO创建数组并用一些值初始化它,简单地做:[null, null, null]
提出效率,我会避免
const arr = new Array(3).fill(value)
。所以简单
push
为IE10:
for (var i = 0; i < arraySize; i++) array[i] = value;
Edit:按照评论中讨论的修改。
array = new Array(arraySize);
for (var i = 0; i < arraySize; i++) array[i] = value;
,只是为了完整(摆弄内置对象的原型通常不是一个好主意):
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);
}
}
update:我刚刚看到您关于
arraySize
while(howMany--)
。
在探索飞机上的数组方法的同时,在这一过程中陷入困境。哦,当我们无聊时我们去的地方。 :)
for(var i=0; i<howMany; i++)
var initializedArray = new Array(30).join(null).split(null).map(function(item, index){
return index;
});
.map()
赢了!我喜欢null,因为传递像“ 0”之类的字符串或任何其他值都令人困惑。我认为这更明确地说我们正在做一些不同的事情。
注意
null
跳过非初始化值。这就是为什么
.map()
不起作用。如果可用,则首选新的8/23/2015
.。desktop(基本支持)
chrome 45(361
)Firefox(壁虎)31(31)
不支持Internet Explorer
eopera不支持safari7.1
从Mdn:
.fill()
[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}
"0".repeat(100000000).split('');
[...new Array(100000000)].map(()=>0)
Https://v8.dev/blog/elements-kinds
),更糟性能特征比“包装阵列”,因此是次优的。方法
Array(arraySize).fill(value)
对于较小的阵列(
arraySize=1e8
)比push
let array = []
for(let i = 0; i < arraySize; i++){
array.push(value)
}
。 答案中的所有其他建议似乎都是愚蠢的骇客,而且性能甚至更糟。
因此,唯一正确的答案是尽可能使用typedarray:
arraySize <= 1e7
fill
使用
1e8
这仅在我的计算机上占4毫秒,而let array = new Int32Array(arraySize) // this array is already 0-initialized
array.fill(value) // only necessary if value != 0
方法的15ms和70ms的方法。
arraySize = 1e7
(可以随意更正确地基准测试,但是结果似乎是如此一致,以至于不必要。)