JavaScript中将一个数组追加到另一个数组

137

如何在JavaScript中将一个数组附加到另一个数组?

其他可能表达此问题的方式:

  • 将一个数组添加到另一个数组中
  • 连接/串联数组
  • 使用另一个数组扩展数组
  • 将一个数组的内容放入另一个数组中

我花了一些时间寻找这个问题的答案。有时候像这样简单的问题是最难找到答案的,因此我在这里添加了问题,希望有足够的关键词和短语,如博客文章所述。请随意用任何其他有用的信息回答这个问题或编辑下面的关键词和短语。

此问题的确切副本:
如何将一个数组附加到现有的JavaScript数组中?


8
自问自答是可以的,但是不可以直接将答案放在问题中。请把答案从问题中删除,单独发布为回答并接受它 :-). 此外,其他人可能会提供比你更好的答案;-)。 - Tomasz Nurkiewicz
2
但应该用答案回答问题,而不是在问题中回答。 但无论如何都是duplicate多次,所以我正在投票关闭。 搜索“javascript concatenate arrays”也可以找到很多结果。 - Dave Newton
@Dave Newton:问题在于,如果你不知道如何使用关键词“连接”,那么你就什么都找不到。我认为这就是为什么很难找到简单问题的答案。专家们会说:“只需输入这个!”但是寻找该问题答案的人将不知道使用专家所知道的关键字进行搜索。 - Chris Dutrow
@DutrowLLC,“追加JavaScript数组”的搜索结果大多数都是相同的,包括这个我之前发布的一个;“append”是您的标题/术语。我有点同情你,但在Google或SO上搜索应该可以找到这些答案。如果我在新问题中输入您的标题,它也会显示上述两个中的后者。 - Dave Newton
@Dave Newton - 我花了一些时间才找到这个问题的答案。我试过几次搜索,大多数情况下,我找到的是更复杂问题的答案。你链接的其中一个问题是重复的,但另一个问题不是。你可能只是快速搜索并找到了一些看起来相似的东西,然后投票关闭了它。请记住,在以下两方面,您与那些从这个问题中受益的人不同:1)您不需要知道答案。2)您已经知道答案。因为您知道答案,所以更容易找到答案。 - Chris Dutrow
显示剩余4条评论
1个回答

176
如果你想修改原始数组而不是返回一个新的数组,可以使用.push()...
array1.push.apply(array1, array2);
array1.push.apply(array1, array3);

我使用了.apply一次性推送数组23中的单个成员。
或者...
array1.push.apply(array1, array2.concat(array3));

处理大型数组时,可以分批处理。
for (var n = 0, to_add = array2.concat(array3); n < to_add.length; n+=300) {
    array1.push.apply(array1, to_add.slice(n, n+300));
}

如果你经常这样做,可以创建一个方法或函数来处理它。
var push_apply = Function.apply.bind([].push);
var slice_call = Function.call.bind([].slice);

Object.defineProperty(Array.prototype, "pushArrayMembers", {
    value: function() {
        for (var i = 0; i < arguments.length; i++) {
            var to_add = arguments[i];
            for (var n = 0; n < to_add.length; n+=300) {
                push_apply(this, slice_call(to_add, n, n+300));
            }
        }
    }
});

并像这样使用:

array1.pushArrayMembers(array2, array3);

var push_apply = Function.apply.bind([].push);
var slice_call = Function.call.bind([].slice);

Object.defineProperty(Array.prototype, "pushArrayMembers", {
    value: function() {
        for (var i = 0; i < arguments.length; i++) {
            var to_add = arguments[i];
            for (var n = 0; n < to_add.length; n+=300) {
                push_apply(this, slice_call(to_add, n, n+300));
            }
        }
    }
});

var array1 = ['a','b','c'];
var array2 = ['d','e','f'];
var array3 = ['g','h','i'];

array1.pushArrayMembers(array2, array3);

document.body.textContent = JSON.stringify(array1, null, 4);


7
这种方式不好,对于大于500个元素的数组没有作用。 - jordan
10
array1 = [].concat(array1, array2, array3 /*, .. */);更好。 - Alex
1
@Alex:无法修改原始数组,这是问题所在。如果已经有一个数组,使用[].concat(...并不是更好的选择,应该是array1.concat(array2, array3) - user1106925
这个 jsperf 显示,仅仅通过循环并使用 push 添加每个元素是最快的方法(至少在我的 Chrome 和操作系统版本中)。它也没有任何堆栈溢出问题。https://jsperf.com/array-prototype-push-apply-vs-concat/20 - bmacnaughton
2
我最喜欢重复问题的答案: https://dev59.com/VnM_5IYBdhLWcg3wcSx_ - Bret Royster
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接