2013-02-05 37 views
16

我試圖如下:有沒有辦法在javascript中使用Array.splice作爲數組的第三個參數?

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的元素並將它們拼接成一個一個,但我更喜歡最快的方法,因爲我需要做很多。

回答

30

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

完美,謝謝。 – CoryG

+0

不客氣! :-) –

+0

真的很圓滑。正是我需要的,謝謝! – 1252748

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

你不需要將2個參數傳遞給'splice.apply'嗎? –

+0

我的確如此。我的錯。 –

3
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] 
0
Array.prototype.splice.apply([1,2,3], [2, 0].concat([4,5,6])); 
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); 
} 
+0

請給答案添加一些解釋。 – Sampada

0

隨着ES6,你可以使用spread操作。它使它更加簡潔和可讀。

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

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

相關問題