Wie kann ich ein Array-Element überspringen .map
?
Mein Code:
var sources = images.map(function (img) {
if(img.src.split('.').pop() === "json"){ // if extension is .json
return null; // skip
}
else{
return img.src;
}
});
Dies wird zurückkehren:
["img.png", null, "img.png"]
javascript
Ismail
quelle
quelle
img.src
wenn das Ergebnis des Split-Pop! = = json?undefined
anstelle von in das Array eingefügtnull
. Nicht so besser ...Antworten:
Nur
.filter()
zuerst:Wenn Sie dies nicht tun möchten, was nicht unangemessen ist, da es einige Kosten verursacht, können Sie das allgemeinere verwenden
.reduce()
. Sie können allgemein ausdrücken.map()
in Bezug auf.reduce
:kann geschrieben werden als
Wenn Sie also Elemente überspringen müssen, können Sie dies ganz einfach tun mit
.reduce()
:In dieser Version ist der Code
.filter()
aus dem ersten Beispiel Teil des.reduce()
Rückrufs. Die Bildquelle wird nur dann auf das Ergebnisarray verschoben, wenn die Filteroperation sie beibehalten hätte.quelle
.reduce()
alles in einem Durchgang verwenden, obwohl ich in Bezug auf die Leistung bezweifle, dass dies einen signifikanten Unterschied bewirken würde.null
,undefined
,NaN
usw.) , es wäre gut , wenn wir eine innerhalb eines verwenden könntenmap()
als Indikator , dass dieses Objekt zu nichts abbildet und übersprungen werden soll. Ich stoße oft auf Arrays, von denen ich 98% zuordnen möchte (z. B.String.split()
am Ende eine einzelne, leere Zeichenfolge belassen, die mir egal ist). Vielen Dank für Ihre Antwort :).reduce()
ist eine Art Baseline-Funktion "Mach was immer du willst", da du die vollständige Kontrolle über den Rückgabewert hast. Vielleicht interessieren Sie auch die hervorragende Arbeit von Rich Hickey in Clojure zum Konzept der Wandler ..map()
. Sie können jedoch.reduce()
stattdessen verwenden, also werde ich das hinzufügen.Ich denke, der einfachste Weg, einige Elemente aus einem Array zu überspringen, ist die Verwendung der filter () -Methode.
Mit dieser Methode ( ES5 ) und der ES6- Syntax können Sie Ihren Code in eine Zeile schreiben , und dies gibt zurück, was Sie wollen :
quelle
.filter()
für gemacht wurdeforEach
und in einem Durchgang statt in zwei?O(n)
Beachten Sie jedoch, dass dies immer noch komplex sein wird, und schauen Sie sich zumindest auch diese beiden Artikel an: frontendcollisionblog.com/javascript/2015/08/15/… und coderwall.com/p/kvzbpa/don-t- use-array-foreach-use-for-anstatt Alles Gute!Seit 2019 ist Array.prototype.flatMap eine gute Option.
Von MDN :
quelle
TLDR: Sie können zuerst Ihr Array filtern und dann Ihre Zuordnung durchführen, dies würde jedoch zwei Durchgänge für das Array erfordern (Filter gibt ein Array an die Zuordnung zurück). Da dieses Array klein ist, sind die Leistungskosten sehr gering. Sie können auch eine einfache Reduzierung durchführen. Wenn Sie sich jedoch noch einmal vorstellen möchten, wie dies mit einem einzigen Durchgang über das Array (oder einen beliebigen Datentyp) erreicht werden kann, können Sie eine Idee namens "Transducer" verwenden, die von Rich Hickey populär gemacht wurde.
Antworten:
Es sollte nicht erforderlich sein, die Punktverkettung zu erhöhen und das Array zu bearbeiten,
[].map(fn1).filter(f2)...
da bei diesem Ansatz für jedereducing
Funktion Zwischenarrays im Speicher erstellt werden .Der beste Ansatz arbeitet mit der eigentlichen Reduktionsfunktion, sodass nur ein Datendurchlauf und keine zusätzlichen Arrays vorhanden sind.
Die Reduktionsfunktion ist die Funktion, die an
reduce
einen Akkumulator und eine Eingabe von der Quelle übergeben wird und etwas zurückgibt, das dem Akkumulator ähneltRessourcen: Rich Hickey Transducer Post
quelle
Hier ist eine unterhaltsame Lösung:
Verwendung mit dem Bind-Operator :
quelle
map
,filter
undconcat
Anrufe.Antwort ohne überflüssige Randfälle:
quelle
Warum nicht einfach eine forEach-Schleife verwenden?
Oder noch einfacher Filter verwenden:
quelle
map
lassen Sie es so, wie es jetzt ist. (war vor 4 Jahren Ich stellte diese Frage, als ich nichts über Codierung wusste)Das
.filter(Boolean)
filtert alle Falsey-Werte in einem bestimmten Array heraus, in Ihrem Fall dasnull
.quelle
Hier ist eine Dienstprogrammmethode (ES5-kompatibel), die nur Nicht-Null-Werte zuordnet (verbirgt den Aufruf zum Reduzieren):
quelle
Ich verwende es
.forEach
, um zu iterieren und das Ergebnis auf dasresults
Array zu übertragen, und verwende es dann. Mit dieser Lösung werde ich das Array nicht zweimal durchlaufenquelle
Um den Kommentar von Felix Kling zu extrapolieren , können Sie Folgendes verwenden
.filter()
:Dadurch werden Falsey-Werte aus dem Array entfernt, das von zurückgegeben wird
.map()
Sie könnten es so weiter vereinfachen:
Oder sogar als Einzeiler mit Pfeilfunktion, Objektzerstörung und
&&
Bediener:quelle
Hier ist eine aktualisierte Version des von @theprtk bereitgestellten Codes . Es ist ein wenig aufgeräumt, um die verallgemeinerte Version zu zeigen, während man ein Beispiel hat.
Hinweis: Ich würde dies als Kommentar zu seinem Beitrag hinzufügen, aber ich habe noch nicht genug Ruf
quelle
Sie können nach Ihrer Methode verwenden
map()
. Die Methodefilter()
zum Beispiel in Ihrem Fall:Der Methodenfilter:
Dann befinden sich nur die vorhandenen Elemente im neuen Array
sourceFiltered
.quelle