使用单个值初始化数组
有没有更紧凑的方式来做这种初始化?
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 == 5
和value == 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);