使用单值初始化数组

old*_*boy 65 javascript

有没有更紧凑的方式来进行这种初始化?

for (var i = 0; i < arraySize; i++) array[i] = value;
Run Code Online (Sandbox Code Playgroud)

Kla*_*sen 107

一个简单的方法是:

var arr = Array(arraySize).fill(value);
Run Code Online (Sandbox Code Playgroud)

将使arr = Array [ 0, 0, 0, 0, 0 ]如果arraySize == 5value == 0,例如.

  • @Perry.你知道,当6%的市场浏览器不支持标准时,那就是浏览器的问题 (15认同)
  • 如果值是对象,请注意fill函数,因为整个数组中可能有相同的对象,这可能会导致不需要的结果. (7认同)
  • IE 不支持:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill#Browser_compatibility (3认同)

DoX*_*icK 36

while(arraySize--) array.push(value);
Run Code Online (Sandbox Code Playgroud)

没有初始化(我知道)


更新

自从4年前发布这个答案以来,人们似乎不断回到这里寻求答案.出于基准测试目的,我使用一些不同的解决方案制作了JSPerf.

上面的解决方案并不是最快的,尽管它很短.要坚持相同的短款式,但性能更佳:

while(size--) array[size] = value;
Run Code Online (Sandbox Code Playgroud)

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; });
Run Code Online (Sandbox Code Playgroud)

一个更高性能的解决方案(在一个,脏,行): 请注意:这将替换范围中的存在值,大小和i变量

for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value;
Run Code Online (Sandbox Code Playgroud)

  • 在JavaScript中,`while`比`for`慢2倍,像`if(number)`这样的简单检查也比`if(number === 0)`慢,因为类型转换(这也适用于布尔值,字符串)和nulls).我的jsPerf测试教会了我这个. (2认同)
  • new Array(len).fill(0); (2认同)

Aeq*_*tas 9

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);
Run Code Online (Sandbox Code Playgroud)

  • 我不会说它的确如此:http://www.stoimen.com/blog/2012/01/24/javascript-performance-for-vs-while/当然你不想总是独自使用 - 这违背了他们的目的.它应该是解释器/编译器的工作,以加速它可以,而不是你的.但即便如此并非总是如此. (2认同)

Chr*_*iss 7

这不是那么紧凑,但可以说更直接.

array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
Run Code Online (Sandbox Code Playgroud)


Ric*_*ove 6

这是一个老问题,但我在现代 JS 中使用它:

[...new Array(1000000)].map(()=>42);
Run Code Online (Sandbox Code Playgroud)


Chr*_*iss 5

这可能不比上述任何技术更好,但它很有趣......

var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})
Run Code Online (Sandbox Code Playgroud)

  • 来自 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map 的 mozilla 文档: map 为数组中的每个元素调用一次提供的回调函数,按顺序,并根据结果构造一个新数组。仅对已分配值(包括未定义)的数组索引调用回调。对于数组中缺失的元素(即从未设置、已删除或从未赋值的索引),不会调用它。 (2认同)