Wyszukiwanie tablicy JavaScript i usunięcie ciągu?

146

Mam:

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

Chcę móc zrobić coś takiego:

array.remove("B");

ale nie ma funkcji usuwania. Jak to osiągnąć?

Rolando
źródło
5
Połączenie .indexOf()i .splice()powinno załatwić sprawę. A może alternatywnie .filter().
Marc B
1
patrz tutaj: stackoverflow.com/questions/3954438/…
benedict_w

Odpowiedzi:

211

W rzeczywistości aktualizuję ten wątek za pomocą nowszego rozwiązania 1-wierszowego:

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

Chodzi o to, aby filtrować tablicę, wybierając wszystkie elementy inne niż element, który chcesz usunąć.

Uwaga: usunie wszystkie wystąpienia.

EDYTOWAĆ:

Jeśli chcesz usunąć tylko pierwsze wystąpienie:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']
Tyrannas
źródło
1
To rozwiązanie zwraca kopię tablicy, podczas gdy użycie splice usuwa elementy w miejscu. Wybór zależy od kontekstu.
twhitehead
6
Jest to idealne rozwiązanie dla rzeczy Redux, w których musisz przywrócić nowy stan.
colinwong
@Regis właściwie nie, arr.filter zwraca nową tablicę. Więc arr.filter (e => e! == 'B') nie zmieni arr. A może nie zrozumiałem poprawnie Twojego komentarza?
Tyrannas,
czy istnieje metoda, aby to zrobić, ale zatrzymać się za pierwszym razem? więc jeśli jest 5 'B, aby po prostu usunąć jeden?
Ari
1
@Ari Zaktualizowałem odpowiedź dotyczącą usuwania tylko jednego elementu
Tyrannas
171

Przewiń listę w odwrotnej kolejności i użyj .splicemetody.

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
    }
}

Odwrotna kolejność jest ważna, gdy wszystkie wystąpienia wyszukiwanego hasła muszą zostać usunięte. W przeciwnym razie licznik wzrośnie, a ty pominiesz elementy.

Gdy trzeba usunąć tylko pierwsze wystąpienie, zadziała również:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}
Rob W
źródło
1
zgaduję, ponieważ powinno być nieco szybciej iterować w odwrotnej kolejności.
Ben Clayton,
1
@BenClayton: Dzięki. FWIW w JavaScript, to nie jest wiarygodne. Odliczanie do 0nie jest automatycznie szybsze, jak na przykład w C. Oczywiście, o ile buforujesz limit, co skomplikowałoby sprawę, gdybyś kontynuował grę po pierwszym meczu (ale nie jeśli zatrzymasz się na nim).
TJ Crowder
Jeśli zależy nam na szybkości, dlaczego nie użyć podczas -? : D
Snuffleupagus
11
Nie chodzi o prędkość, mówi to nawet w swojej odpowiedzi. Chodzi o pomijanie elementów. Jeśli jesteś na pozycji 5 i połączysz tę pozycję, element znajdujący się na pozycji 6 ma teraz wartość 5 . Mimo to, twój licznik pętli rośnie, następna iteracja jest na pozycji 6 i tam właśnie pominąłeś element. Dlatego jest w odwrotnej kolejności.
amenthes
1
Jeśli usuniesz elementy w pętli do przodu, a element zostanie usunięty, ostatnia iteracja może zgłosić wyjątki wskaźnika zerowego, ponieważ będzie odwoływać się do indeksu, który nie istnieje
Drenai
26

Lista One Liners

Rozwiążmy ten problem dla tej tablicy:

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

1. Usuń tylko pierwszą: Użyj Jeśli masz pewność, że element istnieje

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

2. Usuń tylko ostatnie: Użyj Jeśli masz pewność, że element istnieje

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

3. Usuń wszystkie wystąpienia:

array = array.filter(v => v !== 'B'); 
enesn
źródło
21

PRÓBNY

Musisz znaleźć lokalizację tego, czego szukasz, a .indexOf()następnie usunąć ją za pomocą.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)​​​​;

To zajmie się wszystkimi wystąpieniami.

qwertymk
źródło
W przypadku przeglądarek, które nie obsługują .indexOf(), możesz dodać to do pliku javascript.
qwertymk
tak, eleganckie. Jeśli potrzebujesz opcji usunięcia tylko niektórych elementów, np. Tylko pierwszego: to samo zaktualizowane: jsfiddle.net/qpZFd/9
sebilasse
Zawsze pojawia się następujący błąd: Uncaught ReferenceError: array is not defined. Co jest nie tak?
Pathros
Jeśli wybierasz się tą trasą, możesz spokojnie skorzystać z .indexOf()jeszcze trochę więcej. Jeśli przekazana foundjako drugi argument do .indexOf()wywołania w pętli while , elementy w tablicy, które zostały już sprawdzone i skończyło się nie jest równe nie są ponownie sprawdzane: found = arr.indexOf(what, found);
pimmhogeling
14

Po prostu

array.splice(array.indexOf(item), 1);
Matt
źródło
tak, z wyjątkiem tego, że indexOf zwróci, -1jeśli nic nie zostanie znalezione i okrzyki, splice usunie 1 element z końca tablicy
Ricky Spanish
3
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

lub możesz użyć:

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

Zmieniona tablica będzie zawierała bez wartości „B”

śiva gopi
źródło
2

Proste rozwiązanie (ES6)

Jeśli nie masz zduplikowanego elementu

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

Demo online (skrzypce)

Ali Soltani
źródło
To rozwiązanie zawsze usuwa ostatni element, jeśli NIE zostanie znalezione dopasowanie.
markus
1

Musisz napisać własne usunięcie. Możesz zapętlić tablicę, chwycić indeks elementu, który chcesz usunąć, i użyć go splicedo usunięcia.

Alternatywnie możesz utworzyć nową tablicę, zapętlić bieżącą tablicę, a jeśli bieżący obiekt nie pasuje do tego, co chcesz usunąć, umieść go w nowej tablicy.

hvgotcodes
źródło
1

posługiwać się:

array.splice(2, 1);

Spowoduje to usunięcie jednego elementu z tablicy, zaczynając od indeksu 2 (trzeci element)

Ben Clayton
źródło
1
w rzeczywistości usunie drugi element z tablicy, indeks zaczyna się od zera. ta instrukcja ma niejednoznaczność, prostszy przykład może być taki, jak array.splice(2,1)usunięcie 1 elementu o indeksie 2 z tablicy. sprawdź https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice po więcej szczegółów
imdzeeshan