24

我正在尝试以下操作:

var a1 = ['a', 'e', 'f'];  // [a, e, f]
var a2 = ['b', 'c', 'd'];  // [b, c, d]
a1.splice(1, 0, a2);       // expected [a, b, c, d, e, f]
                           // actual (a, [b, c, d], e, f]

我被限制在我的用例中,因为 a2 作为一个不确定大小的数组存在。有谁知道一种方法来提供拼接数组作为替换,或者一个内置函数来做到这一点?我知道我可以遍历 a2 的元素并一次将它们拼接成一个,但我更喜欢最快的方法,因为我需要做很多事情。

4

7 回答 7

35

Array.splice在前两个之后支持多个参数。这些参数都将添加到数组中。知道了这一点,您可以使用Function.apply将数组作为参数列表传递。

var a1 = ['a', 'e', 'f'];
var a2 = ['b', 'c', 'd'];

// You need to append `[1,0]` so that the 1st 2 arguments to splice are sent
Array.prototype.splice.apply(a1, [1,0].concat(a2));
于 2013-02-05T19:41:50.153 回答
20

使用 ES6,您可以使用扩展运算符。它使它更加简洁和可读。

var a1 = ['a', 'e', 'f'];
var a2 = ['b', 'c', 'd'];

a1.splice(1, 0, ...a2);
console.log(a1)

于 2017-10-25T08:56:39.807 回答
4
var a1 = ['a', 'e', 'f'],
    a2 = ['b', 'c', 'd'];

a1.splice(1, 0, a2);

var flatten = [].concat.apply([], a1); // ["a", "b", "c", "d", "e", "f"]
于 2013-02-05T19:42:45.457 回答
2

这应该可以解决问题。

var a1 = ['a', 'e', 'f'];
var a2 = ['b', 'c', 'd'];

a1.concat(a2, a1.splice(1,a1.length-1)) // [a, b, c, d, e, f]
于 2013-02-05T19:46:49.723 回答
1

尝试这个:

var params = a2.slice(0);
params.unshift(1,0);
a1.splice.apply(a1,params);

在更一般的情况下:

Array.prototype.splice_multi = function(offset,todelete,insert) {
    var params = insert.slice(0);
    params.unshift(offset,todelete);
    return this.splice.apply(this,params);
};
a1.splice_multi(1,0,a2);
于 2013-02-05T19:42:29.613 回答
0
Array.prototype.splice.apply( [1,2,3], [2, 0].concat([4,5,6]) );
于 2013-08-02T16:23:41.000 回答
0
private moveElements(source: Array<any>, target: Array<any>) {
    target.push(...source);
    source.splice(0, source.length);
    //or
    [].push.apply(target,source);
    source.splice(0, source.length);
}
于 2016-07-28T13:47:56.310 回答