使用单个值初始化数组

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

for (var i = 0; i < arraySize; i++) array[i] = value; 
 while(arraySize--) array.push(value); 

没有初始化(我知道的)


更新

自从四年前发布这个答案以来,人们似乎一直在这里回答这个问题。 为了进行基准testing,我用一些不同的解决scheme做了一个JSPerf

上面的解决scheme并不是最快的,尽pipe它很短。 要坚持同样的简短风格,但有更好的performance:

 while(size--) array[size] = value; 

2016年2月更新用更多的testing用例更新了JSPerf。

如果performance不重要,你想要一个单线:

 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; }); 

一个更高性能的解决scheme(在一个脏的行中): 请注意:这将取代范围内存在的值,大小和variables

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

做一个简短的方法是:

 var arr = Array(arraySize).fill(value); 

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

OP似乎是在一次性使用情况下比效率和可重用性更紧凑。 对于其他寻求效率的人来说,这是一个尚未提及的优化。 由于您事先知道数组的长度,因此请在分配值之前进行设置。 否则,arrays将被dynamic地重新resize – 不理想!

 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;}); 

这不太可能比以上任何一种技术都好,但很有趣…

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

为了效率,我会避免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; 

编辑:修改如评论中所述。

如果你需要做很多次,你可以随时写一个函数:

 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--)全部replacefor(var i=0; i<howMany; i++)旧的for(var i=0; i<howMany; i++)

在飞机上探索arrays方法的时候,偶然发现了这个问题。哦,当我们无聊的时候,我们去的地方。 🙂

 var initializedArray = new Array(30).join(null).split(null).map(function(item, index){ return index; }); 

.map()null为胜利! 我喜欢null,因为传递一个像'0'或任何其他值的顶部string混淆。 我认为这是更明确的,我们正在做一些不同的事情。

请注意.map()跳过未初始化的值。 这就是为什么new Array(30).map(function(item, index){return index}); 不起作用。 新的.fill()方法是可取的,但是浏览器支持应该在.fill()之前注明。

桌面(基本支持)

  • Chrome 45(36 1 )
  • Firefox(Gecko)31(31)
  • Internet Explorer不支持
  • 歌剧不支持
  • Safari 7.1

来自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} 
 var a=Array(100).join("|").split("|").map(Number);