有没有一种方法可以在JavaScript中使用Array.splice,并将第三个参数作为一个数组?

25

我正在尝试以下操作:

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存在大小不确定的数组。是否有人知道一种将splice作为替换输入数组的方法,或者其他内置函数可以实现此功能?我知道我可以逐个迭代a2中的元素并逐个拼接它们,但我希望尽可能快地完成,因为我需要经常这样做。

7个回答

36

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));

23

使用 ES6,你可以使用展开操作符,它可以使代码更加简洁易读。

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

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


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"]

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]

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);

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);
}

1
请在答案中添加一些解释。 - Sampada

0
Array.prototype.splice.apply( [1,2,3], [2, 0].concat([4,5,6]) );

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