2013-02-05 11 views
16

Sto tentando il seguente:C'è un modo per usare Array.splice in javascript con il terzo parametro come array?

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] 

sto confinato nel mio caso d'uso avendo a2 esiste come un array di dimensioni non determinanti. Qualcuno sa di un modo per alimentare la giunzione di un array come sostituzione, o in alternativa una funzione built-in per fare questo? So che potrei scorrere gli elementi di a2 e unirli uno alla volta, ma preferirei il metodo più veloce possibile perché dovrei farlo molto.

risposta

30

Array.splice supporta più argomenti dopo i primi due. Questi argomenti verranno tutti aggiunti all'array. Sapendo questo, è possibile utilizzare Function.apply per passare l'array come elenco degli argomenti.

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

Perfetto, grazie. – CoryG

+0

Prego! :-) –

+0

Davvero elegante. Proprio quello di cui avevo bisogno, grazie! – 1252748

1

Prova questo:

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

Nel caso più generale:

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

Non è necessario passare 2 argomenti a 'splice.apply'? –

+0

Lo faccio davvero. Colpa mia. –

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

Questo dovrebbe fare il trucco.

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

Si prega di aggiungere alcune spiegazioni alla risposta. – Sampada

0

Con ES6, è possibile utilizzare l'operatore spread. Lo rende molto più conciso e leggibile.

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

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

Problemi correlati