【问题标题】:Javascript: push an entire list?Javascript:推送整个列表?
【发布时间】:2011-06-18 02:21:12
【问题描述】:

是否有一种内置方法可以像这样将一个列表附加到另一个列表中:

var a = [1,2,3];
a.append([4,5]);
// now a is [1,2,3,4,5];

concat() 做了类似的事情,但返回结果。我想要修改现有列表的东西,例如push()

【问题讨论】:

标签: javascript


【解决方案1】:

push 可以,但您还需要使用apply

var a = [1,2,3];
a.push.apply(a, [4,5])

【讨论】:

  • 我想应该是Array.prototype.push.apply
  • @lonesomeday:你想的没错。 a.push.apply 也可以。我显然分裂了差异。
  • @Kooilnc:apply 的 MDC 文档(链接到答案)应该涵盖它。阅读它,如果您需要更多信息,请告诉我。
  • 没关系,忘了argsArray
  • 使用[].push.apply() 的冗余度较低(即不使用数组名两次),但仍比使用Array.prototyp.push.apply() 短。 -- 根据 JSPerf 测试“concat vs push.apply”,它的效率也很高。
【解决方案2】:
var list = [1, 2];

人们已经向您展示了如何做到这一点:

  1. 推送:list.push.apply(list, [3, 4]);
  2. 连接:list = list.concat([4, 5]);

但我想告诉你ES6 spread operatorlist.push(...[3, 4]);

请记住,目前支持它的浏览器并不多(您可以使用转译器)。

【讨论】:

  • 我发现,如果你的数组非常大并且只插入大约 5-20 个元素,list.push.apply 方法会快得多。
  • @Aloso 谢谢,您可以将其发布为带有相应基准的答案(很高兴看到“非常快”和“非常大”背后的数字
  • 我认为这不值得一个完整的答案。不过,我做了一个jsperf来测试速度:jsperf.com/array-vs-linkedlist-concat
  • 好的,还有更多,所以我将添加一个答案。
【解决方案3】:

如果你使用的是 ES6,你可以使用扩展运算符

例如:-

listOne = [1,2,3]
listTwo = [4,5,6]
listTwo.push(...listOne)

【讨论】:

    【解决方案4】:

    这个怎么样:

    var a = [1, 2, 3];
    a = a.concat([4, 5]);
    // a is now [1, 2, 3, 4, 5]
    

    【讨论】:

    • 一个接一个地推他们不是更有效率吗?
    • @shoosh,是的,可能会更有效率。
    • 在连接之前考虑以下代码: var b = a;变量 a 发生了变化,但 b 仍然是 1、2、3。example
    • 哇!使用concat奇怪效率低下! [jsperf.com/concat-vs-push-apply/10]
    • 两年后 Chrome 37 和 IE11 都报告 concat 比 push apply 快 67%...
    【解决方案5】:

    因为我刚刚编写了一个 Web 应用程序,其中必须连接许多数组并且性能至关重要,所以我测试了哪种方法最快 in this jsperf。结果很有趣。

    在我的测试中,我将 10 个元素添加到包含 10,000 个元素的列表或数组中。

    这里是测试用例,从最快到最慢。结果是在 Chrome 62 中测量的,但 Firefox 47 的表现类似:

    • LinkedList.prototype.concat:90,313,485 次操作/秒

      list.concat(concatList);
      // This function has to change only 1-2 refences
      
    • Array.prototype.pushfor 循环中:3,794,962 ops/sec

      for (var i = 0, len = concatArr.length; i < len; i++) {
          array.push(concatArr[i]);
      }
      // Probably fastest in real life
      
    • Array.prototype.push.apply:2,193,469 次操作/秒

      array.push.apply(array, concatArr);
      
    • Array.prototype.concat:22,701 次操作/秒

      array = array.concat(concatArr);
      

    很遗憾,如果您想将数组/列表连接到 多个 LinkedLists,LinkedList 版本将不起作用。如果必须在每次 concat 操作之前将数组复制到 LinkedList,它也没有任何好处。所以,对我来说,获胜者是 for 循环

    不使用Array.prototype.push.apply 的一个原因是,如果串联数组太大,它会失败。根据this answer 的说法,连接数组在 Firefox 中不能超过 500,000 个元素,在 Chrome 中不能超过 150,000 个元素。

    我排除了spread operator,因为并非所有浏览器都支持它。在 Chrome 中,它与 Array.prototype.push.apply 差不多快,在 Firefox 中则慢一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2015-05-05
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      相关资源
      最近更新 更多