【问题标题】:JavaScript: How to add x to an array x times?JavaScript:如何将 x 添加到数组 x 次?
【发布时间】:2014-04-25 00:48:44
【问题描述】:

我想这类似于数组填充,但我想知道它是否可以简化。

var arr = [1,2,3],
    x   = 5;

for (var i=0; i<x; i++) {
  arr.push(x);
}

console.log(arr);
//=> [1, 2, 3, 5, 5, 5, 5, 5]

有什么方法可以在不使用 for 循环的情况下做到这一点?


更新

即使有移动聪明解决方案,for循环似乎是最高效的

Benchmarks on jsperf

【问题讨论】:

    标签: javascript arrays concat pad


    【解决方案1】:

    另一个 ES6 选项是使用 Array.from() 创建一个长度为原始数组 + x 的数组:

    const pad = (arr, x) => 
      Array.from({ length: arr.length + x }, (_, i) => arr[i] ?? x)
    
    const arr = [1,2,3], x = 5;
    
    console.log(pad(arr, x));

    【讨论】:

      【解决方案2】:

      对于那些使用 ES6 并遇到此问题的人。尝试使用 Array.fill() https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/fill

      我在测试中使用这种方法为 x 行生成模拟数据而无需循环。

      编辑:抱歉,我在这个问题上不感兴趣。此代码将生成一个 x 长的数组,但它们都将具有相同的值。更好的代码sn-p在文末。

      newOrdersX: function(x) {
        return Array(x).fill({
          name: faker.random.name()
        });
      }`
      

      这将是一个 x 级长的数组,但每个值都会不同。请注意,.fill() 仍然需要调用,否则将不起作用。

      newOrdersX: function(x) {
        return Array(x).fill().map(() => ({
          name: faker.random.name()
        }));
      }`
      

      【讨论】:

        【解决方案3】:

        没有 for 循环:

        var arr = [1,2,3], x   = 5;
        arr = arr.concat(Array.apply(null, Array(x)).map(function() { return x; }));
        
        // or even
        arr = arr.concat(Array.apply(null, Array(x)).map(x.valueOf, x));
        

        【讨论】:

        • 天啊!这就是我所能说的:-)
        • 我认为.map(x.valueOf, x) 在这里甚至可能会略有改进
        • @naomik 就像 paxdiablo 所说的,您当前的代码没有问题,在这种情况下我们最好不要避免 for 循环。
        • @naomik 确实,已添加到答案中。
        • 我在原始问题中添加了基准。无论如何 +1 创意^.^
        【解决方案4】:

        除非你因编写的每一行代码而受到惩罚,否则该代码是可以的:简洁且易于理解。

        如果您确实受到处罚,请使用:

        for (var i = 0; i < x; i++) arr.push(x);
        

        单行:-)

        除此之外,您最好的选择是以下函数:

        arr = appendXCopiesOfX (arr, x);
        

        但我不认为你真的在那里获得了什么,因为如上所述,理解这么小的循环应该没有什么问题。

        总而言之,试图改进你目前拥有的东西可能是浪费时间和精力。

        【讨论】:

        • +1 务实。很容易陷入毫无意义的优化中。
        猜你喜欢
        • 2011-12-04
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 2022-09-19
        • 2022-11-16
        • 2021-09-30
        • 2021-09-06
        • 1970-01-01
        相关资源
        最近更新 更多