Ricerca dell'array Javascript e rimozione della stringa?


134

Io ho:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

Voglio essere in grado di fare qualcosa del tipo:

array.remove("B");

ma non esiste una funzione di rimozione. Come posso farlo?


5
Una combinazione di .indexOf()e .splice()dovrebbe fare il trucco. O forse, in alternativa, .filter().
Marc B,


Risposte:


186

In realtà sto aggiornando questa discussione con una soluzione a 1 riga più recente:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

L'idea è fondamentalmente di filtrare l'array selezionando tutti gli elementi diversi dall'elemento che si desidera rimuovere.

Nota: rimuoverà tutte le occorrenze.

MODIFICARE:

Se si desidera rimuovere solo la prima occorrenza:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']

1
Questa soluzione restituisce una copia dell'array, mentre l'uso della giunzione rimuove gli elementi in posizione. Quale scegli dipende dal contesto.
twhitehead,

6
Questo è perfetto per le cose Redux in cui è necessario restituire un nuovo stato.
Colinwong,

@Regis attualmente no, arr.filter restituisce un nuovo array. Quindi arr.filter (e => e! == 'B') non modificherà arr. O forse non ho capito bene il tuo commento?
Tyrannas,

c'è un metodo per farlo ma per fermarsi alla prima occorrenza? quindi se ci sono 5 'B per rimuoverne solo uno?
Ari,

1
@Ari Ho aggiornato la risposta per la rimozione di un solo elemento
Tyrannas,

171

Scorrere l'elenco in ordine inverso e utilizzare il .splicemetodo.

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

L'ordine inverso è importante quando è necessario rimuovere tutte le occorrenze del termine di ricerca. Altrimenti, il contatore aumenterà e salterai gli elementi.

Quando deve essere rimossa solo la prima occorrenza, funzionerà anche quanto segue:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}

1
Sto indovinando perché è pensato per essere leggermente più veloce da scorrere al contrario.
Ben Clayton,

1
@BenClayton: grazie. FWIW, in JavaScript, non è vero in modo affidabile. Il conto alla rovescia 0non è automaticamente più veloce come è, diciamo, C. Finché si memorizza il limite, ovviamente, il che complicherebbe le cose se si continua dopo il primo incontro (ma non se ci si ferma).
TJ Crowder,

Se stiamo andando per la velocità, perché non usare while -? : D
Snuffleupagus

11
Non si tratta di velocità, lo dice anche nella sua risposta. Riguarda gli elementi SKIPPING. Se ti trovi in ​​posizione 5 e la giunti in tale posizione, l'elemento formelry situato in posizione 6 è ora in 5 . Tuttavia, il contatore del loop aumenta, la successiva iterazione è la posizione 6 ed è qui che hai saltato un elemento. Ecco perché è in ordine inverso.
amenthes,

1
Se rimuovi elementi in un ciclo in avanti e un elemento viene rimosso, l'ultima iterazione può generare eccezioni puntatore null poiché farà riferimento a un indice che non esiste
Drenai,

24

Elenco di una fodera

Risolviamo questo problema per questo array:

var array = ['A', 'B', 'C'];

1. Rimuovere solo il primo: utilizzare Se si è sicuri che l'elemento esiste

array.splice(array.indexOf('B'), 1);

2. Rimuovi solo l'ultimo: Usa Se sei sicuro che l'articolo esiste

array.splice(array.lastIndexOf('B'), 1);

3. Rimuovere tutte le occorrenze:

array = array.filter(v => v !== 'B'); 

21

DEMO

Devi trovare la posizione di ciò che stai cercando con .indexOf()poi rimuoverlo.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

Questo si prenderà cura di tutte le occorrenze.


Per i browser che non supportano .indexOf()puoi aggiungere questo al tuo file javascript.
qwertymk,

sì, elegante. Se hai bisogno di un'opzione per rimuovere solo alcuni elementi, ad esempio solo il primo: lo stesso aggiornato: jsfiddle.net/qpZFd/9
sebilasse

Ho sempre trovato il seguente errore: Uncaught ReferenceError: array is not defined. Che c'è?
Pathros,

Se stai percorrendo questo percorso, puoi facilmente trarne vantaggio .indexOf(). Se si passa foundcome secondo argomento alla .indexOf()chiamata all'interno del ciclo while , gli elementi nell'array che erano già stati controllati e che alla fine non erano uguali non vengono controllati di nuovo: found = arr.indexOf(what, found);
pimmhogeling

14

Semplicemente

array.splice(array.indexOf(item), 1);

Sì, tranne quell'indiceOf tornerà -1se non viene trovato nulla e whoops, splice eliminerà 1 elemento dalla fine dell'array
Ricky Spanish

2

Soluzione semplice (ES6)

Se non hai elementi duplicati

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

Demo online (violino)


Questa soluzione rimuove sempre l'ultimo elemento se NON viene trovata alcuna corrispondenza.
markus s

1

Devi scrivere tu stesso rimuovi. È possibile eseguire il ciclo sull'array, afferrare l'indice dell'elemento che si desidera rimuovere e utilizzare spliceper rimuoverlo.

In alternativa, è possibile creare un nuovo array, eseguire il loop sull'array corrente e, se l'oggetto corrente non corrisponde a ciò che si desidera rimuovere, inserirlo in un nuovo array.



1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

oppure puoi usare:

const changedArray = array.filter( (value) => value === 'B');

L'array changed conterrà il valore senza "B"


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.