代码之家  ›  专栏  ›  技术社区  ›  oldestlivingboy

使用单个值初始化数组

  •  55
  • oldestlivingboy  · 技术社区  · 15 年前

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

    for (var i = 0; i < arraySize; i++) array[i] = value;
    
    8 回复  |  直到 15 年前
        1
  •  39
  •   DoXicK    10 年前
    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
  •  111
  •   Klaus Byskov Pedersen    11 年前

    一个简单的方法是:

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

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

        3
  •  9
  •   Aequitas    13 年前

    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);
    
        4
  •  8
  •   magikMaker    7 年前

    // assuming `value` is what you want to fill the array with
    // and `arraySize` is the size of the array
    Array(arraySize).fill(value);
    
        5
  •  7
  •   Christopher Weiss    13 年前

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

    array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
    
        6
  •  5
  •   Christopher Weiss    13 年前

    var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})
    
        7
  •  2
  •   Kyaw Tun    13 年前

    为了效率,我会避免 push . 如此简单

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

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

    编辑:根据评论中的讨论进行修改。

        8
  •  1
  •   Álvaro González    15 年前

    如果需要多次执行,可以始终编写函数:

    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++) .

        9
  •  0
  •   Joshua Robinson    11 年前

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

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

    .map() 和 null

    请注意 .map() new Array(30).map(function(item, index){return index}); 不起作用。新的 .fill() 2015年8月23日 .

    桌面(基本支持)

    • 1 )
    • 火狐(壁虎)31(31)
    • 不支持Internet Explorer
    • 不支持Opera

    从 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}