Jak mogę pominąć element tablicy .map
?
Mój kod:
var sources = images.map(function (img) {
if(img.src.split('.').pop() === "json"){ // if extension is .json
return null; // skip
}
else{
return img.src;
}
});
Zwróci to:
["img.png", null, "img.png"]
javascript
Ismail
źródło
źródło
img.src
jeśli wynik podzielonego popu! = json?undefined
zostanie wstawione do tablicy zamiastnull
. Nie tak lepiej ...Odpowiedzi:
Po
.filter()
pierwsze:Jeśli nie chcesz tego robić, co nie jest nierozsądne, ponieważ wiąże się to z pewnymi kosztami, możesz użyć bardziej ogólnego
.reduce()
. Ogólnie możesz wyrazić.map()
w kategoriach.reduce
:można zapisać jako
Jeśli więc chcesz pominąć elementy, możesz to łatwo zrobić za pomocą
.reduce()
:W tej wersji kod
.filter()
z pierwszej próbki jest częścią.reduce()
wywołania zwrotnego. Źródło obrazu jest wypychane na tablicę wyników tylko w przypadku, gdy zachowałoby to działanie filtru.źródło
.reduce()
i zrobić to wszystko w jednym przejściu, chociaż pod względem wydajności wątpię, aby zrobiłoby to znaczącą różnicę.null
,undefined
,NaN
etc) Byłoby dobrze, gdybyśmy mogli wykorzystać jedną wewnątrzmap()
jako wskaźnik, że ten obiekt mapuje do niczego i powinny być pominięte. Często spotykam tablice, które chcę zmapować 98% (np.String.split()
Pozostawiając na końcu pojedynczy, pusty ciąg, o który nie dbam). Dzięki za odpowiedź :).reduce()
to rodzaj funkcji „rób co chcesz”, ponieważ masz pełną kontrolę nad wartością zwracaną. Być może zainteresuje Cię doskonała praca Richa Hickeya w Clojure dotycząca koncepcji przetworników ..map()
. Możesz jednak użyć.reduce()
zamiast tego, więc dodam to.Myślę, że najprostszym sposobem na pominięcie niektórych elementów z tablicy jest użycie metody filter () .
Korzystając z tej metody ( ES5 ) i składni ES6 , możesz napisać kod w jednym wierszu , a to zwróci to, co chcesz :
źródło
.filter()
został stworzonyforEach
wypełnianie go jednym przejściem zamiast dwóch?O(n)
skomplikowane i spójrz przynajmniej na te dwa artykuły: frontendcollisionblog.com/javascript/2015/08/15/... i coderwall.com/p/kvzbpa/don-t- use-array-foreach-use-for-zamiast Wszystkiego najlepszego!Od 2019 roku Array.prototype.flatMap jest dobrą opcją.
Z MDN :
źródło
TLDR: Możesz najpierw przefiltrować tablicę, a następnie wykonać mapę, ale wymagałoby to dwóch przejść w tablicy (filtr zwraca tablicę do mapy). Ponieważ ta tablica jest niewielka, jest to bardzo mały koszt wydajności. Możesz także zrobić proste zmniejszenie. Jeśli jednak chcesz sobie wyobrazić, jak można to zrobić za pomocą pojedynczego przejścia przez tablicę (lub dowolny typ danych), możesz skorzystać z pomysłu zwanego „przetwornikami”, który stał się popularny przez Richa Hickeya.
Odpowiedź:
Nie powinniśmy wymagać zwiększania łańcucha i operowania na
[].map(fn1).filter(f2)...
macierzach, ponieważ takie podejście tworzy tablice pośrednie w pamięci dla każdejreducing
funkcji.Najlepsze podejście działa na rzeczywistej funkcji redukcji, więc jest tylko jedno przejście danych i żadnych dodatkowych tablic.
Funkcja redukująca jest funkcją przekazaną do
reduce
i pobiera akumulator i wkład ze źródła i zwraca coś, co wygląda jak akumulatorZasoby: post: przetworniki Rich Hickey
źródło
Oto zabawne rozwiązanie:
Użyj z operatorem powiązania :
źródło
map
,filter
iconcat
rozmowy.Odpowiedź bez zbędnych przypadków na krawędziach:
źródło
Dlaczego nie skorzystać z pętli forEach?
Lub jeszcze prostszy filtr:
źródło
map
pozwala zachować ją tak, jak teraz. (był 4 lata temu zadałem to pytanie, gdy nie wiedziałem nic o kodowaniu).filter(Boolean)
Będzie odfiltrować żadnych wartości falsey w danej tablicy, która w danym przypadku jestnull
.źródło
Oto metoda narzędzia (zgodna z ES5), która odwzorowuje tylko wartości niepuste (ukrywa wywołanie redukcji):
źródło
Używam
.forEach
do iteracji i wypycham wynik doresults
tablicy, a następnie go używam, dzięki temu rozwiązaniu nie będę dwa razy zapętlać tablicyźródło
Aby ekstrapolować komentarz Felixa Klinga , możesz użyć
.filter()
tego w następujący sposób:Spowoduje to usunięcie wartości falsey z tablicy zwracanej przez
.map()
Możesz to jeszcze bardziej uprościć:
Lub nawet jako jednowarstwowa przy użyciu funkcji strzałki, destrukcji obiektu i
&&
operatora:źródło
Oto zaktualizowana wersja kodu dostarczonego przez @theprtk . Jest to trochę oczyszczone, aby pokazać uogólnioną wersję, mając przykład.
Uwaga: dodam to jako komentarz do jego postu, ale nie mam jeszcze wystarczającej reputacji
źródło
Możesz użyć metody po tobie
map()
. Metodafilter()
na przykład w twoim przypadku:Filtr metod:
Następnie tylko istniejące elementy znajdują się w nowej tablicy
sourceFiltered
.źródło