Jak usunąć puste elementy z tablicy w JavaScript?
Czy istnieje prosty sposób, czy muszę go zapętlić i usunąć ręcznie?
javascript
arrays
node.js
Tamas Czinege
źródło
źródło
var a = [,,]
avar a = [undefined, undefined]
. Pierwsza jest naprawdę pusta, ale druga faktycznie ma dwa klucze, ale zundefined
wartościami.Odpowiedzi:
EDYCJA: Odpowiedzi na to pytanie prawie dziewięć lat temu, kiedy nie było wielu przydatnych metod wbudowanych w
Array.prototype
.Teraz z pewnością poleciłbym ci skorzystanie z
filter
metody.Weź pod uwagę, że ta metoda zwróci ci nową tablicę z elementami spełniającymi podane przez ciebie kryteria funkcji zwrotnej.
Na przykład, jeśli chcesz usunąć
null
lubundefined
wartości:Będzie to zależeć od tego, co uważasz za „puste”, na przykład, jeśli masz do czynienia z łańcuchami, powyższa funkcja nie usunie elementów, które są pustymi łańcuchami.
Jeden typowy wzór, który widzę często wykorzystywane jest do usunięcia elementów, które są falsy , które zawierają ciąg pusty
""
,0
,NaN
,null
,undefined
, ifalse
.Możesz przejść do
filter
metody,Boolean
funkcji konstruktora lub zwrócić ten sam element w funkcji kryteriów filtrowania, na przykład:Lub
W obu przypadkach działa to, ponieważ
filter
metoda w pierwszym przypadku wywołujeBoolean
konstruktor jako funkcję, konwertując wartość, aw drugim przypadkufilter
metoda wewnętrznie zamienia wartość zwrotną wywołania zwrotnego niejawnie naBoolean
.Jeśli pracujesz z rzadkimi tablicami i próbujesz pozbyć się „dziur”, możesz użyć
filter
metody przekazującej wywołanie zwrotne zwracające wartość true, na przykład:Stara odpowiedź: nie rób tego!
Używam tej metody, rozszerzając natywny prototyp Array:
Lub możesz po prostu wepchnąć istniejące elementy do innej tablicy:
źródło
splice
Połączenie jest bardzo drogie w starszych przeglądarkach, ponieważ muszą zmienić numerację wszystkich kluczy tablicy, aby zamknąć lukę.Array.prototype
za pomocą,Object.defineProperty
aby nowa funkcja była właściwością niewymienną, a następnie uniknąć pogorszenia wydajności spowodowanego wstawieniem.hasOwnProperty
każdej pętli.Proste sposoby:
lub - (tylko dla pojedynczych elementów tablicy typu „tekst”)
lub - Klasyczny sposób: prosta iteracja
przez jQuery:
AKTUALIZACJA - kolejny szybki i fajny sposób (za pomocą ES6):
Usuń puste wartości
źródło
arr = arr.filter(function(n){return n; });
foo.join("").split("")
wydaje się, że działa tylko wtedy, gdy ciągi znaków są pojedynczymi znakamiarr.filter(e=>e)
a to można powiązać za pomocą mapy, redukcji itp.Jeśli chcesz usunąć WSZYSTKIE puste wartości („”, null, undefined i 0):
Aby usunąć puste wartości i podziały wiersza:
Przykład:
Powrót:
AKTUALIZACJA (na podstawie komentarza Alnitaka)
W niektórych sytuacjach możesz chcieć zachować „0” w tablicy i usunąć wszystko inne (null, undefined i „”), jest to jeden ze sposobów:
Powrót:
źródło
function(e){return !!e}
!!e
będzie zawierać NaN (w przeciwieństwie do 0) whereouse
nie (jak 0).var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);
usuwa niezdefiniowane „” i 0Po prostu jedna wkładka:
lub używając underscorejs.org :
źródło
Boolean
działa jako funkcja ...Boolean
jako funkcję, po prostu wrócitrue
lubfalse
spadnie, wartość jest prawdziwie / fałszywa.(true).constructor === Boolean
. A potem powiedz mi, czy możemy to zrobić z innymi wbudowaniami w JS. ;)) (oczywiście wykluczono 5 innych wbudowanych konstruktorów. (String, Array, Object, Function, Number))Jeśli masz Javascript w wersji 1.6 lub nowszej, możesz użyć
Array.filter
trywialnejreturn true
funkcji zwrotnej, np .:ponieważ
.filter
automatycznie pomija brakujące elementy w oryginalnej tablicy.Strona MDN, do której prowadzi powyższy link, zawiera także niezłą wersję sprawdzającą błędy,
filter
której można używać w interpreterach JavaScript, które nie obsługują oficjalnej wersji.Należy pamiętać, że nie spowoduje to usunięcia
null
wpisów ani wpisów o wyraźnejundefined
wartości, ale OP wyraźnie zażądał „brakujących” wpisów.źródło
undefined
jako danej wartości.Do usuwania dziur należy użyć
Do usuwania wartości dołków i fałszowania (null, undefined, 0, -0, NaN, "", false, document.all):
Aby usunąć hole, null i, undefined:
źródło
[, ,]
arr.filter(x => x)
JS sprawdzi, czy x jest prawdą czy fałszem, tzn.if (x)
Dlatego tylko nowa wartość prawdy zostanie przypisana do nowej listy.Czysty sposób na zrobienie tego.
źródło
undefined
; to w zasadzie usuwa wszystkie wartości fałszowania.Prosty ES6
źródło
[1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
.Z podkreśleniem / Lodash:
Ogólny przypadek użycia:
Z pustkami:
Zobacz dokumentację lodash bez .
źródło
Tylko
ES6
i nowsze metody wersji, zakładamy, że tablica jest poniżej:Prosta droga:
źródło
Jeśli korzystanie z biblioteki jest opcją, wiem, że underscore.js ma funkcję o nazwie compact () http://documentcloud.github.com/underscore/, ale ma także kilka innych przydatnych funkcji związanych z tablicami i kolekcjami.
Oto fragment ich dokumentacji:
źródło
@Alnitak
Właściwie Array.filter działa we wszystkich przeglądarkach, jeśli dodasz dodatkowy kod. Patrz poniżej.
Jest to kod, który musisz dodać do IE, ale warto też użyć filtru i programowania funkcjonalnego.
źródło
Ponieważ nikt inny o tym nie wspominał, a większość ludzi ma podkreślenie w swoim projekcie, możesz również użyć
_.without(array, *values);
.źródło
ES6:
źródło
Może być łatwiej zapętlić tablicę i zbudować nową tablicę z elementów, które chcesz zachować z tablicy, niż próbować zapętlić i splicować zgodnie z sugestią, ponieważ modyfikacja długości tablicy podczas jej zapętlania może wprowadzać problemy.
Możesz zrobić coś takiego:
W rzeczywistości jest to bardziej ogólne rozwiązanie:
Wpadasz na pomysł - wtedy możesz mieć inne typy funkcji filtrów. Prawdopodobnie więcej niż potrzebujesz, ale czułem się hojny ...;)
źródło
Co z tym (ES6): Aby usunąć wartość Falsy z tablicy.
źródło
Powinieneś użyć filtru, aby uzyskać tablicę bez pustych elementów. Przykład na ES6
źródło
Ja po prostu dodając swój głos do powyższego „Call ES5 użytkownika
Array..filter()
z globalnym konstruktora” Golf-Hack, ale sugerujemy użycieObject
zamiastString
,Boolean
alboNumber
jak zasugerowano powyżej.W szczególności ES5
filter()
już nie wyzwalaundefined
elementów w tablicy; więc funkcja, która uniwersalnie zwracatrue
, która zwraca wszystkiefilter()
trafienia elementów , z konieczności zwróci tylko nie-undefined
elementy:Pisanie
...(function(){return true;})
jest jednak dłuższe niż pisanie...(Object)
; a wartość zwracana przezObject
konstruktor będzie w każdym przypadku jakimś przedmiotem. W przeciwieństwie do sugerowanych powyżej konstruktorów boksowania pierwotnego, żadna możliwa wartość obiektu nie jest falsey, a zatem w ustawieniu boolowskimObject
jest krótką rękąfunction(){return true}
.źródło
someArray.filter(String);
Faktycznie jest on równoważnysomeArray.filter(function(x){ return String(x); });
. Jeśli chcesz usunąć wszystkie wartości fałszowania,someArray.filter(Boolean);
usuwa 0, -0, NaN, false, '', null i undefined.Object
konstruktora w przeciwieństwie doreturn true
metody. @robocat OP poprosił o usunięcie pustych elementów, a nie zer.Kiedy użyłem wyżej głosowanej odpowiedzi, pierwszy przykład, otrzymywałem poszczególne znaki dla długości łańcucha większej niż 1. Poniżej znajduje się moje rozwiązanie tego problemu.
Zamiast nie wracać, jeśli jest niezdefiniowany, zwracamy, jeśli długość jest większa niż 0. Mam nadzieję, że ktoś komuś pomoże.
Zwroty
źródło
["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123
Zastępowanie tej funkcji. .. z String, jak na ironię, pozostawia liczby, ale dałby taki sam wynik w podanej tablicy.źródło
Co z tym:
źródło
join() === join(',')
:)To działa, przetestowałem go w AppJet (możesz skopiować i wkleić kod na jego IDE i nacisnąć „przeładuj”, aby zobaczyć, jak działa, nie trzeba tworzyć konta)
źródło
for ... in
, co powoduje pominięcie brakujących elementów. Testundefined
służy tylko do usunięcia rzeczywistych elementów, które są jawnie ustawione na tę wartość.Innym sposobem na to jest skorzystanie z właściwości length tablicy: spakuj elementy inne niż null po lewej stronie tablicy, a następnie zmniejsz długość. Jest to algorytm lokalny - nie przydziela pamięci, co jest bardzo złe dla śmieciarza - i ma bardzo dobre zachowanie w najlepszym / średnim / najgorszym przypadku.
To rozwiązanie, w porównaniu do innych tutaj, jest od 2 do 50 razy szybsze w Chrome i 5 do 50 razy szybsze w Firefox, jak można zobaczyć tutaj: http://jsperf.com/remove-null-items-from-array
Poniższy kod dodaje do tablicy macierz, której nie można wyliczyć, „removeNull”, która zwraca „to” do łączenia łańcuchowego:
źródło
arr.filter(e => e)
.zwroty
źródło
„Niewłaściwe” użycie pętli for ... in (object-member). => Tylko prawdziwe wartości pojawiają się w ciele pętli.
źródło
for ... in
powoduje usunięcie niezdefiniowanych kluczy z tablicy, ale tak naprawdę nie ma tutaj kodu, który w przeciwnym razie akceptowałby tylko „prawdziwe” wartościTo może ci pomóc: https://lodash.com/docs/4.17.4#remove
źródło
Wynik:
Usunie pusty element z tablicy i wyświetli inny element.
źródło
Usuwanie wszystkich pustych elementów
Jeśli tablica zawiera puste obiekty, tablice i ciągi obok innych pustych elementów, możemy je usunąć za pomocą:
Proste kompaktowanie (usuwanie pustych elementów z tablicy)
Z ES6:
Ze zwykłym Javascriptem ->
źródło
Filtrowanie nieprawidłowych wpisów za pomocą wyrażenia regularnego
źródło
Najlepszym sposobem na usunięcie pustych elementów jest użycie
Array.prototype.filter()
, jak już wspomniano w innych odpowiedziach.Niestety
Array.prototype.filter()
nie jest obsługiwany przez IE <9. Jeśli nadal potrzebujesz obsługi IE8 lub nawet starszej wersji IE, możesz użyć następującego polifillu, aby dodać obsługęArray.prototype.filter()
w tych przeglądarkach:źródło