Szukam skutecznego sposobu usunięcia wszystkich elementów z tablicy javascript, jeśli są one obecne w innej tablicy.
// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
// and this one:
var toRemove = ['b', 'c', 'g'];
Chcę operować myArray, aby pozostawić go w tym stanie: ['a', 'd', 'e', 'f']
W jQuery używam grep()
i inArray()
, co działa dobrze:
myArray = $.grep(myArray, function(value) {
return $.inArray(value, toRemove) < 0;
});
Czy istnieje czysty sposób javascript, aby to zrobić bez zapętlania i łączenia?
javascript
arrays
Kran
źródło
źródło
.filter()
. Zamiast tego użyjeszfor
pętli. Można tego uniknąć,.splice()
jeśli oryginalne zamówienie nie musi być utrzymywane. Lub istnieją sposoby na.splice()
zwiększenie wydajności, jeśli uważasz, że będzie wiele rzeczy do usunięcia.Odpowiedzi:
Użyj
Array.filter()
metody:Niewielkie ulepszenie, ponieważ
Array.includes()
wzrosła obsługa przeglądarki :Następna adaptacja za pomocą funkcji strzałek :
źródło
.difference()
zasadzie to robi.toRemove()
na wielkie i zmieniaj wywołanie zwrotne zel
nael.toUpperCase()
.myArray = myArray.filter( el => !toRemove.includes( el ) );
filter
Metoda powinna załatwić sprawę:Jeśli
toRemove
tablica jest duża, tego rodzaju wzorzec wyszukiwania może być nieefektywny. Bardziej wydajne byłoby stworzenie mapy, aby wyszukiwania byłyO(1)
raczej niżO(n)
.źródło
Jeśli korzystasz z tablicy obiektów. Następnie poniższy kod powinien wykonać magię, w której właściwość obiektu będzie kryterium usuwania zduplikowanych elementów.
W poniższym przykładzie duplikaty zostały usunięte, porównując nazwy każdego elementu.
Wypróbuj ten przykład. http://jsfiddle.net/deepak7641/zLj133rh/
źródło
Lodash ma również funkcję użyteczną do tego: https://lodash.com/docs#difference
źródło
Zestawy ECMAScript 6 mogą być używane do obliczania różnych elementów dwóch tablic:
źródło
Właśnie zaimplementowałem jako:
Użyj jako:
źródło
prototypes
rodzimych obiektów, takich jakArray
. To może mieć długoterminowy konflikt z przyszłym rozwojem języka ( patrzflatten
przypadek )Jeśli nie możesz użyć nowych rzeczy ES5,
filter
myślę, że utknąłeś z dwiema pętlami:źródło
źródło
Teraz w smaku jednowarstwowym:
Może nie działać na starych przeglądarkach.
źródło
Możesz użyć _.differenceBy z lodash
Przykładowy kod tutaj: CodePen
źródło
A może najprostszy z możliwych:
źródło
includes
nie jest dostępny przed ES7.Właściwym sposobem usunięcia wszystkich elementów zawartych w innej tablicy jest uczynienie tablicy źródłowej tym samym obiektem poprzez usunięcie tylko elementów:
Lub odpowiednik CoffeeScript:
Testowanie narzędzi chrome dev:
Korzystanie z frameworka Angular jest najlepszym sposobem na utrzymanie wskaźnika do obiektu źródłowego podczas aktualizacji kolekcji bez dużej liczby obserwatorów i przeładowań.
źródło
Buduję logikę bez żadnych wbudowanych metod, daj mi znać o wszelkich optymalizacjach lub modyfikacjach. Testowałem w edytorze JS, czy działa dobrze.
źródło