用单个值初始化数组


Answers:


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

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

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

在许多情况下,“ arraySize”不会是可变的(可以是常量或文字,或者-我知道,不好的做法-“ array.length”)。通过将大小表示为变量,我对此不太清楚。
oldestlivingboy

1
true:“ for(var i = arraySize; i--;)array.push(value);” 然后:-)但是我想您已经知道了这一点
DoXicK,2010年

1
您是对的-该语法确实节省了五个字符。;-)
oldestlivingboy

3
whileforJavaScript慢2倍,并且像类型转换这样的简单检查if (number)也比if (number === 0)类型转换慢(这也适用于布尔值,字符串和null)。我的jsPerf测试教会了我这一点。
Triang3l 2012年

2
新的Array(len).fill(0);
穆罕默德·乌默尔

128

一种简单的方法是:

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

例如将arr = Array [ 0, 0, 0, 0, 0 ]ifarraySize == 5value == 0



22
@Perry。您知道吗,当市场占有率6%的浏览器不支持该标准时,那就是该浏览器的问题
Slava

10
如果值是一个对象,请谨慎使用fill函数,因为整个数组中可能有相同的对象,这可能会导致不良结果。
Gregzenegair '16

12

我认为这很好,简短而优雅:

// assuming `value` is what you want to fill the array with
// and `arraySize` is the size of the array
Array(arraySize).fill(value);

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

1
在JavaScript中,for速度是的2倍while
Triang3l 2012年

2
我不会说这么精确:stoimen.com/blog/2012/01/24/javascript-performance-for-vs-while当然,您不希望总是单独使用这两种方法-这违背了它们的目的。在可能的地方(而不是您自己的地方)加快它应该是解释器/编译器的工作。但是,即使那样并非总是如此。
Aram Kocharyan 2013年

8

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

array = Array.apply(null, new Array(arraySize)).map(function () {return value;});

5

这可能不会比上面的任何技术都要好,但是很有趣。

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

您能解释为什么var arr = (new Array(5)).map(() => 1);不起作用吗?
巴拉特·古普塔

1
map()方法仅适用于数组中的值。它跳过未定义的元素。
Christopher Weiss '18

那么,new Array(5)当我们做一个映射之后,我们不是在数组上操作吗?此外,这[1,undefined,3].map(() => 5)按预期工作。它不会跳过undefined
Bharat Gupta

2
从位于developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…的mozilla文档中:map依次为数组中的每个元素调用提供的回调函数一次,并根据结果构造一个新的数组。仅对具有已分配值(包括未定义)的数组索引进行调用。不会为缺少数组的元素(即从未设置的索引,已删除的索引或从未分配值的索引)调用它。
Christopher Weiss '18

太棒了 谢谢@克里斯托弗!
巴拉特·古普塔


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; 

编辑:按照注释中的讨论进行修改。


for (var i = 0; i < arraySize; ++i)具有与您的代码几乎相同的性能,但看起来更干净。但是while (arraySize--)慢了2倍。
Triang3l 2012年

是的,但是为分配内存array比开始更有效array[0]
Kyaw Tun 2012年

2
否。如果从头开始初始化数组,将在内部使用哈希表,但是如果从0开始初始化数组,并且只有顺序索引,则将使用真实数组(至少在V8中)。JavaScript不分配(highest_index + 1)元素,它仅分配初始化的元素。
Triang3l 2012年

从[Build / 12](channel9.msdn.com/Events/Build/2012/4-000)讲,IE10需要预先分配才能有效。参考[在幻灯片54上](channel9.msdn.com/Events/Build/2012/4-000
Kyaw Tun

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--)旧内容替换为old old即可for(var i=0; i<howMany; i++)


1

在飞机上探索数组方法时偶然发现了这一点。:)

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日

桌面(基本支持)

  • 铬45(36 1
  • 火狐(Gecko)31(31)
  • Internet Explorer不支持
  • Opera不支持
  • 的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}

如今(2019年6月),可以轻松地这样写: [...Array(30)].map((_, i) => i);
magikMaker '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.