Come posso aggiungere nuovi elementi di array all'inizio di un array in Javascript?


1586

Ho bisogno di aggiungere o anteporre elementi all'inizio di un array.

Ad esempio, se il mio array appare come di seguito:

[23, 45, 12, 67]

E la risposta dalla mia chiamata AJAX è 34, voglio che l'array aggiornato sia come il seguente:

[34, 23, 45, 12, 67]

Attualmente sto programmando di farlo in questo modo:

var newArray = [];
newArray.push(response);

for (var i = 0; i < theArray.length; i++) {
    newArray.push(theArray[i]);
}

theArray = newArray;
delete newArray;

C'è un modo migliore per farlo? Javascript ha delle funzionalità integrate che lo fanno?

La complessità del mio metodo è O(n)e sarebbe davvero interessante vedere implementazioni migliori.


9
Cordiali saluti: Se è necessario inserire continuamente un elemento all'inizio di un array, è più veloce usare le pushistruzioni seguite da una chiamata reverse, invece di chiamare unshiftsempre.
Jenny O'Reilly,

2
@ JennyO'Reilly dovresti pubblicare questo come risposta. Abbinato perfettamente al mio caso d'uso. grazie
rob

2
Test delle prestazioni: jsperf.com/adding-element-to-the-array-start Ma i risultati sono diversi per ciascun browser.
Avernikoz,

Risposte:


2813

Usa unshift. È come push, tranne per il fatto che aggiunge elementi all'inizio della matrice anziché alla fine.

  • unshift/ push- aggiunge un elemento all'inizio / alla fine di un array
  • shift/ pop - rimuove e restituisce il primo / ultimo elemento di un array

Un semplice diagramma ...

   unshift -> array <- push
   shift   <- array -> pop

e grafico:

          add  remove  start  end
   push    X                   X
    pop           X            X
unshift    X             X
  shift           X      X

Consulta la documentazione dell'array MDN . Praticamente ogni linguaggio che ha la capacità di spingere / pop elementi da un array avrà anche la possibilità di spostare / spostare elementi (a volte chiamati push_front/ pop_front), non dovresti mai implementarli da soli.


Come sottolineato nei commenti, se si desidera evitare di mutare l'array originale, è possibile utilizzare concat, che concatena due o più array insieme. Puoi usarlo per spingere funzionalmente un singolo elemento sul fronte o sul retro di un array esistente; per fare ciò, è necessario trasformare il nuovo elemento in un singolo array di elementi:

const array = [ 3, 2, 1 ]

const newFirstElement = 4

const newArray = [newFirstElement].concat(array) // [ 4, 3, 2, 1 ]

concatpuò anche aggiungere elementi. Gli argomenti concatpossono essere di qualsiasi tipo; sono implicitamente racchiusi in una matrice a elemento singolo, se non sono già una matrice:

const array = [ 3, 2, 1 ]

const newLastElement  = 0

// Both of these lines are equivalent:
const newArray1 = array.concat(newLastElement)   // [ 3, 2, 1, 0 ]
const newArray2 = array.concat([newLastElement]) // [ 3, 2, 1, 0 ]

51
L'uso concatpotrebbe essere preferibile in quanto restituisce il nuovo array. Molto utile per il concatenamento. [thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)ecc ... Se usi unshift, non puoi fare questo incatenamento perché tutto ciò che ottieni è la lunghezza.
StJohn3D,

4
shift / unshift, push / pop, giunzione. Nomi molto logici per tali metodi.
linuxunil,

1398

immagine delle operazioni di array

var a = [23, 45, 12, 67];
a.unshift(34);
console.log(a); // [34, 23, 45, 12, 67]


117
Il motivo per cui le persone hanno bisogno di una linea guida visiva per 4 funzioni utilizzate quotidianamente è a causa dei nomi delle funzioni crittografate ... Perché non spostare non si chiama Inserisci? Maiusc dovrebbe essere Rimuovi. ecc ...
Pascal,

76
// Perché unshift non si chiama Inserisci? // Deriva dalle convenzioni del linguaggio di programmazione C in cui gli elementi dell'array venivano trattati come uno stack. (vedi perlmonks.org/?node_id=613129 per una spiegazione completa)
dreftymac,

25
@Pascal No, inserire e rimuovere sarebbero nomi particolarmente cattivi per questo; implicano un accesso casuale, invece di aggiungere / rimuovere dalla parte anteriore dell'array
meagar

25
Avrei pensato che unshift avrebbe rimosso la prima chiave e shift avrebbe inserito la prima chiave, ma questo è solo il mio pensiero generale
Shannon Hochkins,

27
Mi piace il riferimento al DNA
Hunter WebDev

235

Con ES6, utilizzare l'operatore spread ...:

DEMO

var arr = [23, 45, 12, 67];
arr = [34, ...arr]; // RESULT : [34,23, 45, 12, 67]

console.log(arr)


19
crea anche un nuovo array, utile per le funzioni pure
devonj

qual è l'implicazione delle prestazioni qui? È più lento dell'uso di unshift ()?
Peter T.

1
Certo, sarà più lento poiché è un array immutabile (creando un nuovo array). Se si lavora con un array di grandi dimensioni o le prestazioni sono il primo requisito, si consiglia di utilizzare concatinvece.
Abdennour TOUMI

le prestazioni non sono importanti nel 2018, le nuove versioni nel browser e nel nodo ottengono le stesse prestazioni
stackdave

75

Un altro modo per farlo concat

var arr = [1, 2, 3, 4, 5, 6, 7];
console.log([0].concat(arr));

La differenza tra concate unshiftè che concatrestituisce un nuovo array. Le prestazioni tra loro possono essere trovate qui .

function fn_unshift() {
  arr.unshift(0);
  return arr;
}

function fn_concat_init() {
  return [0].concat(arr)
}

Ecco il risultato del test

inserisci qui la descrizione dell'immagine


Sarebbe utile che la tua risposta aggiungesse il confronto delle prestazioni di entrambi oltre all'aggiunta del riferimento.
Ivan De Paz Centeno,

Ho appena ricevuto jsPerf temporaneamente non disponibile mentre stiamo lavorando al rilascio di v2. Riprova più tardi dal link. Un altro buon motivo per includere i risultati invece di collegarli ad essi.
Tigro

Risultato jsPrefunshift :: 25.510 ± 3,18% 99% più lento concat: 2.436.894 ± 3,39% più veloce
Illuminatore

Nell'ultimo Safari, fn_unshift () funziona più velocemente.
passatgt

Nell'ultimo Safari (v 10), fn_unshift () è di nuovo più lento.
rmcsharry,

45

Cheatsheet veloce:

I termini shift / unshift e push / pop possono essere un po 'confusi, almeno per le persone che potrebbero non avere familiarità con la programmazione in C.

Se non hai familiarità con il gergo, ecco una rapida traduzione di termini alternativi, che potrebbe essere più facile da ricordare:

* array_unshift()  -  (aka Prepend ;; InsertBefore ;; InsertAtBegin )     
* array_shift()    -  (aka UnPrepend ;; RemoveBefore  ;; RemoveFromBegin )

* array_push()     -  (aka Append ;; InsertAfter   ;; InsertAtEnd )     
* array_pop()      -  (aka UnAppend ;; RemoveAfter   ;; RemoveFromEnd ) 

20

hai un array: var arr = [23, 45, 12, 67];

Per aggiungere un elemento all'inizio, si desidera utilizzare splice:

var arr = [23, 45, 12, 67];
arr.splice(0, 0, 34)
console.log(arr);


arr.splice (0, lunghezza arr., 34);
Lior Elrom,

1
@LiorElrom cosa fa lo snippet?
Janus Troelsen,

@poushy è specifico del browser, in Firefox 54 è il unshift50% più veloce (ma per lo più più leggibile)
icl7126

@poushy Non più. Molto più lento.
Andrew,

17

Senza mutate

In realtà, tutti unshift/ pushe shift/ pop mutano l'array di origine.

Il unshift/ pushaggiungi un elemento alla matrice esistente da inizio / fine e shift/pop dall'inizio / fine rimuove un elemento dall'inizio / fine della matrice.

Ma ci sono alcuni modi per aggiungere elementi a un array senza una mutazione. il risultato è un nuovo array, per aggiungere alla fine dell'array utilizzare il codice seguente:

const originArray = ['one', 'two', 'three'];
const newItem = 4;

const newArray = originArray.concat(newItem); // ES5
const newArray2 = [...originArray, newItem]; // ES6+

Per aggiungere l'inizio dell'array originale, utilizzare il codice seguente:

const originArray = ['one', 'two', 'three'];
const newItem = 0;

const newArray = (originArray.slice().reverse().concat(newItem)).reverse(); // ES5
const newArray2 = [newItem, ...originArray]; // ES6+

Con il modo sopra, aggiungi all'inizio / fine di un array senza una mutazione.


Ho appena messo una slicefunzione alla fine originArrayper impedirne la mutabilità.
Ahmad Khani il

1
Eccezionale! Quando arriva la gestione dello stato (Redux) ... questa risposta è preziosa!
Pedro Ferreira,

1
Questo è il modo corretto!
mmm

10

Utilizzo della destrutturazione ES6: (evitando la mutazione dell'array originale)

const newArr = [item, ...oldArr]


8

Se è necessario inserire continuamente un elemento all'inizio di un array, è più veloce utilizzare le pushistruzioni seguite da una chiamata reverse, invece di chiamare unshiftsempre.

Test benchmark: http://jsben.ch/kLIYf


1
Nota: l'array iniziale dovrebbe essere vuoto.
192kb,

5

Usando spliceinseriamo un elemento in un array al begnning:

arrName.splice( 0, 0, 'newName1' );

È una risposta corretta Grazie Srikrushna
Khanh Tran
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.