【问题标题】:How to create a zero filled JavaScript array of arbitrary length? [duplicate]如何创建一个任意长度的零填充 JavaScript 数组? [复制]
【发布时间】:2013-12-11 21:59:23
【问题描述】:

创建任意长度的零填充 JavaScript 数组的最有效方法是什么?

【问题讨论】:

  • 有什么理由你想要零填充而不是用undefined填充的X长度数组,可以很容易地声明为new Array(x),其中x是0到2之间的整数^ 32 - 1.

标签: javascript


【解决方案1】:

默认情况下,Uint8ArrayUint16ArrayUint32Array 类将零作为其值,因此您不需要任何复杂的填充技术,只需:

var ary = new Uint8Array(10); 

数组ary的所有元素默认为零。

【讨论】:

  • 完美。这应该在顶部。 Stackoverflow 不根据投票选择最佳答案。 @deadrunk
【解决方案2】:

在 Javascript ES6 中有一个非常简单的解决方案。我来这里是因为我想缩短代码高尔夫:

n = 999  // arbitrary length
a = Array(n).fill(0)

console.log(a)

【讨论】:

    【解决方案3】:

    新的 ES6 数组扩展允许您使用 fill 方法本地执行此操作。现在 IE edge、Chrome 和 FF 都支持了,但是查看compatibility table

    new Array(3).fill(0) 会给你[0, 0, 0]。您可以使用任何值填充数组,例如 new Array(5).fill('abc')(甚至是对象和其他数组)。

    除此之外,您还可以使用填充修改以前的数组:

    arr = [1, 2, 3, 4, 5, 6]
    arr.fill(9, 3, 5)  # what to fill, start, end
    

    给你:[1, 2, 3, 9, 9, 6]

    【讨论】:

    • 显然是最好和最语义化的方式!
    【解决方案4】:

    这样试试怎么样:

    Array.apply(null, new Array(10)).map(Number.prototype.valueOf,0);
    //Output as [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    

    new Array(10+1).join('0').split('').map(parseFloat)
    //Output as [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    

    编辑:-

    如果您的数组是动态的,那么只需将其放入一个函数中,该函数接受一个数字并将 10 替换为该变量。

    【讨论】:

    • 我的数组长度是动态的
    • 只需将其放入一个接受数字并用该变量替换 10 的函数中!
    • @Shryme:- 谢谢。我也在我的回答中更新了这一点!
    • OP 要求最有效的方法,我认为这是@kennebec 的回答:jsperf.com/fill-array-stackoverflow。到目前为止,我刚刚在 Chrome 中测试了不同的方法。
    • @jameslafferty 为什么没有push 的for循环?
    【解决方案5】:

    如果你想要一个 9 长度的数组:

    Array.apply(null, {length: 9}).map(function() {return 0;})
    

    如果你想要一个 X 长度的数组:

    Array.apply(null, {length: X}).map(function() {return 0;})
    

    如果你有一个数组并想重写它的值:

    var arr=[54,53,6,7,88,76]
    arr=arr.map(function() {return 0;})
    

    你可以用你想要的任何东西填充数组,只需在 .map 中的 function 中更改 return 的值:: p>

    Array.apply(null, {length: 9}).map(function() {return "a string";})
    Array.apply(null, {length: 9}).map(function() {return Math.random();})
    Array.apply(null, {length: 9}).map(function() {return NaN;})
    Array.apply(null, {length: 9}).map(function() {return null;})
    Array.apply(null, {length: 9}).map(function() {return true;})
    Array.apply(null, {length: 9}).map(function() {return;})
    

    最后一个将用 undefined

    填充数组

    【讨论】:

      【解决方案6】:
      function repeatArray(value, len){
        var A=[],i=0;
        while (i<len) A[i++]= value;
        return A;
      }
      

      【讨论】:

        【解决方案7】:

        我测试了两个 Unit8Array

        [].slice.apply(new Uint8Array(n));
        

        和join/split方法

        new Array(n + 1).join('0').split('').map(parseFloat);
        

        jsPerf 中获得有趣的结果。 Chrome 和 Firefox 在这两个方面都相当慢(在 48,000 到 76,000 次操作之间)。但是 Opera 和 Safari 在 Uint8Array 函数(最多 438,000 次操作)上的表现都非常出色。我想我会开始使用 Uint8Array 并希望 Chrome 和 Firefox 有所改进。

        【讨论】:

          【解决方案8】:

          一种方法可以使用递归。

          function fillArray(l, a) {
            a = a || [];
            if (0 < l) {
              l -= 1;
              a[l] = 0;
              return fillArray(l, a);
            }
            return a;
          }
          

          我还发布了一个更经典的选项:

          function fillArray(l) {
            var a;
            for (a = []; 0 < l; l-=1, a[l]=0);
            return a;
          }
          

          【讨论】:

            猜你喜欢
            • 2019-09-29
            • 1970-01-01
            • 1970-01-01
            • 2012-02-29
            • 1970-01-01
            • 2015-02-23
            • 2022-12-18
            • 1970-01-01
            • 2015-12-24
            相关资源
            最近更新 更多