2013-07-07 18 views
20

Voglio sostituire gli elementi in qualche array da 0 elementi, con elementi di un altro array con lunghezza variabile. Come:Come sostituire elementi nell'array con elementi di un altro array

var arr = new Array(10), anotherArr = [1, 2, 3], result; 
result = anotherArr.concat(arr); 
result.splice(10, anotherArr.length); 

C'è un modo migliore?

+0

risultati attesi? – 1983

+0

@NagaJolokia, [1, 2, 3, indefinito, indefinito ...] –

+0

Con lunghezza === 10, giusto? – 1983

risposta

38

È possibile utilizzare il metodo splice per sostituire parte di un array con elementi di un altro array, ma è necessario chiamarlo in un modo speciale in quanto prevede che gli elementi siano parametri, non l'array.

Il metodo splice prevede parametri come (0, anotherArr.Length, 1, 2, 3), quindi è necessario creare un array con i parametri e utilizzare il metodo apply per chiamare il metodo splice con i parametri:

Array.prototype.splice.apply(arr, [0, anotherArr.length].concat(anotherArr)); 

Esempio:

var arr = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']; 
var anotherArr = [ 1, 2, 3 ]; 

Array.prototype.splice.apply(arr, [0, anotherArr.length].concat(anotherArr)); 

console.log(arr); 

uscita:

[ 1, 2, 3, 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 

Demo: http://jsfiddle.net/Guffa/bB7Ey/

+2

Se il primo array è più lungo della sostituzione, la soluzione di cui sopra non rimuoverà gli elementi extra alla fine. Questa leggera modifica: Array.prototype.splice.apply (arr, [0, arr.length] .concat (anotherArr)); – perilandmishap

+0

@perilandmishap: Sì, questo era il punto. Se vuoi sostituire l'array puoi semplicemente sostituire l'intero oggetto: 'arr = anotherArr;'. – Guffa

+0

In stato di flusso di stato/redux manager di stato si sta lavorando frequentemente con un const e non è consentito modificare il riferimento al proprio oggetto, quindi solo fare la riassegnazione non è un'opzione. È un problema sciocco, ma lo stato di JavaScript è un po 'sciocco al momento. – perilandmishap

3

Si può semplicemente utilizzare splice, in grado di aggiungere nuovi elementi durante la rimozione di quelle vecchie:

var arr = new Array(10), anotherArr = [1, 2, 3]; 

arr.splice.apply(arr, [0, anotherArr.length].concat(anotherArr)) 

Se non si desidera modificare la matrice arr, è possibile utilizzare slice che restituisce un copia superficiale della matrice:

var arr = new Array(10), anotherArr = [1, 2, 3], result = arr.slice(0); 

result.splice.apply(result, [0, anotherArr.length].concat(anotherArr)); 

in alternativa, è possibile utilizzare slice per tagliare i primi elementi e aggiungendo il anotherArr su top:

result = anotherArr.concat(arr.slice(anotherArr.length)); 
1

non sono sicuro se si tratta di un modo "migliore", ma almeno consente di scegliere l'indice iniziale (mentre la soluzione funziona solo a partire dall'indice 0). Here's a fiddle.

// Clone the original array 
var result = arr.slice(0); 
// If original array is no longer needed, you can do with: 
// var result = arr; 

// Remove (anotherArr.length) elements starting from index 0 
// and insert the elements from anotherArr into it 
Array.prototype.splice.apply(result, [0, anotherArr.length].concat(anotherArr)); 

(Damnit, tante ninjas. :-P)

1

È possibile solo impostare la lunghezza della matrice in questo caso. Per i casi più complessi vedi la risposta di @ Guffa.

var a = [1,2,3]; 
a.length = 10; 
a; // [1, 2, 3, undefined x 7] 
5

Per chi cerca un modo per sostituire l'intero contenuto di un array con intero contenuto di un altro array preservando l'array originale:

Array.prototype.replaceContents = function (array2) { 
    //make a clone of the 2nd array to avoid any referential weirdness 
    var newContent = array2.slice(0); 
    //empty the array 
    this.length = 0; 
    //push in the 2nd array 
    this.push.apply(this, newContent); 
}; 

La funzione prototipo prende un array come parametro che servirà come nuovo contenuto di array, lo clonerà per evitare qualsiasi elemento di riferimento bizzarro, svuota l'array originale e quindi inserisce l'array passato come contenuto. Ciò conserva l'array originale e tutti i riferimenti.

Ora si può semplicemente fare questo:

var arr1 = [1, 2, 3]; 
var arr2 = [3, 4, 5]; 
arr1.replaceContents(arr2); 

So che questo non è rigorosamente quello che la domanda iniziale è stato chiesto, ma questa domanda viene in su per prima quando si esegue una ricerca in google, e ho pensato che qualcun altro potrebbe trovare questo utile in quanto era la risposta di cui avevo bisogno.

3

In ES6, dattiloscritto, Babel o simili si può semplicemente fare:

arr1.length = 0; // Clear your array 
arr1.push(...arr2); // Push the second array using the spread opperator 

semplice.

13

In ES6 con una sola operazione, si può fare questo per sostituire l'intero contenuto di un array: contenuti

let a = [1, 2, 3, 4] 
let b = [5, 6, 7, 8] 

a.splice(0, a.length, ...b) 

console.log(a) // -> [5, 6, 7, 8] 

Il dell'array a sarà interamente sostituita da b contenuti.

Si noti che questo deve essere utilizzato solo in applicazioni critiche preformance, come animazioni FPS alte, per evitare la creazione di nuovi array.

Normalmente creerei un nuovo array che mantenga l'immutabilità.

EDIT: Ho appena realizzato che questo non risponde esattamente alla domanda, ma potrebbe aiutare alcuni googler.

+0

Bella soluzione! Questo è migliore di quello che riguarda 'length' perché posso anche mappare sullo stesso array. Per esempio. 'let a = [5, 6, 7, 8]; a.splice (0, a.length, ... a.map (x => x * x)); 'E non richiede la riassegnazione a' a' neanche. – nils

+2

Basta usare 'a.splice (0, Infinito, ... b)'. Il secondo argomento è irrilevante fintanto che è più grande del numero di elementi da rimuovere. –

Problemi correlati