2013-02-05 14 views
16

mam próby następujące:Czy istnieje sposób użycia Array.splice w javascript z trzecim parametrem jako tablicy?

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] 

jestem zamknięta w moim przypadku użycia poprzez a2 istnieć jako tablica indeterminant wielkości. Czy ktoś wie o sposobie podawania tablicy jako substytucji lub alternatywnie wbudowanej funkcji, aby to zrobić? Wiem, że mogłem powtórzyć elementy a2 i połączyć je pojedynczo, ale wolałbym najszybszą możliwą metodę, ponieważ będę musiał to zrobić bardzo często.

Odpowiedz

30

Array.splice obsługuje wiele argumentów po pierwszych dwóch. Wszystkie te argumenty zostaną dodane do tablicy. Wiedząc o tym, możesz użyć Function.apply, aby przekazać tablicę jako listę argumentów.

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

Perfect, dziękuję. – CoryG

+0

Nie ma za co! :-) –

+0

Naprawdę elegancko. Właśnie tego potrzebowałem, dzięki! – 1252748

1

Spróbuj tego:

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

w bardziej ogólnym przypadku:

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

Nie musisz przekazywać 2 argumentów do 'splice.apply'? –

+0

Rzeczywiście. Mój błąd. –

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

To powinno załatwić sprawę.

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

Proszę dodać wyjaśnienie do odpowiedzi. – Sampada

0

Z ES6, można użyć operatora spread. Dzięki temu jest on bardziej zwięzły i czytelny.

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

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