【问题标题】:Create JS array of repeated value创建重复值的JS数组
【发布时间】:2018-07-09 20:36:06
【问题描述】:

我想问一个有效的方法来创建这样的数组:

[ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3 ... n, n, n, n, n, n ]

每 6 个项目,数字加 1++。

function createFaces(n){
    var array = [];
    var l = 1; 
    while(n > 0){
        for(var i = 0; i < 6; i++){
            array.push(l)
        }
        l++;
        n--;
    }
    return array;
}

【问题讨论】:

  • 您要添加多少行?
  • 没关系(比如6)
  • 你的实现有什么问题?
  • 没有错,但我试图找到更有效的方法。
  • 您编写的方式只遍历每个目标元素数组一次,开销最小。您可以通过将其设置为从i=6i=6*n+5 的单个循环并将i/6 推送到数组来使其稍微更有效(也许)。同样,您可以消除您的外部索引之一。不过,这几乎是毫无意义的微优化。

标签: javascript arrays function for-loop while-loop


【解决方案1】:

使用Array.prototype.map()函数

let fill = function(length, threshold) {
  let i = 1;
  return new Array(length * threshold).fill().
            map((_, idx) => 
                (idx + 1) % threshold === 0 ? i++ : i);
};

console.log(fill(7, 6));

【讨论】:

    【解决方案2】:

    要创建一个大小为 n 且填充了值 v 的数组,您可以这样做

    Array(n).fill(v);
    

    在你的函数上下文中:

    function createFaces(n){
        var array = [];
        for (var i=1; i <= n; i++) {
          array = array.concat(Array(6).fill(i));
        }
        return array;
    }
    

    【讨论】:

    • 这也创建了一个数组数组,这不是 OP 的代码所做的。做同样的事情,for 循环内的行应该是array = array.concat(Array(6).fill(i));
    • 糟糕,我看到了一个不存在的数组。是的连接。
    【解决方案3】:

    如果你想要一个平面数组...

    function createFaces(n, x){
        for(var i=0, a=[]; i<n; a.push(...Array(x).fill(i)) && i++){}
        return a;
    }
    
    console.log(createFaces(7, 6));

    【讨论】:

      【解决方案4】:

      您可以将Array.from 与值的函数一起使用。

      function createFaces(n) {
          return Array.from({ length: 6 * n }, (_, i) => Math.floor(i / 6) + 1);
      }
      
      console.log(createFaces(7));
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

      • Array.from 的好方法
      猜你喜欢
      • 1970-01-01
      • 2015-08-21
      • 2019-08-28
      • 2020-04-23
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      相关资源
      最近更新 更多