使用单值初始化数组

时间:2010-10-29 07:27:10

标签: javascript

有没有更简洁的方法来进行这种初始化?

for (var i = 0; i < arraySize; i++) array[i] = value;

10 个答案:

答案 0 :(得分:91)

这样做的一个简短方法是:

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

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

答案 1 :(得分:36)

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

更高性能的解决方案(在一个,脏,行): 请注意:这将替换范围

中存在的值,大小和i变量
for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value;

答案 2 :(得分: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);

答案 3 :(得分:7)

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

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:4)

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

[...new Array(1000000)].map(()=>42);

答案 6 :(得分: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; 

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

答案 7 :(得分: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--)替换为旧的for(var i=0; i<howMany; i++)

答案 8 :(得分:0)

在飞机上探索阵列方法时偶然发现了这个问题。哦,当我们感到无聊时,我们去的地方。 :)

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日时注明浏览器支持。

桌面(基本支持)

  • Chrome 45(36 1
  • Firefox(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}

答案 9 :(得分:0)

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

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