Ich möchte verstehen, wie ein Array am besten aus allen Elementen eines anderen herausgefiltert werden kann . Ich habe es mit der Filterfunktion versucht, aber es fällt mir nicht ein, wie ich ihr die Werte geben soll, die ich entfernen möchte.
Etwas wie:
var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(myCallback);
// filteredArray should now be [1,3]
function myCallBack(){
return element ! filteredArray;
//which clearly can't work since we don't have the reference <,<
}
Wenn die Filterfunktion nicht nützlich ist, wie würden Sie dies implementieren?
Bearbeiten: Ich habe die mögliche doppelte Frage überprüft, und es könnte für diejenigen nützlich sein, die Javascript leicht verstehen. Die als gut geprüfte Antwort macht die Sache einfach.
javascript
arrays
filter
Koop4
quelle
quelle
return arrTwo.indexOf(e) === -1;
Code:var filteredArr = firstArr.filter(el => secondArr.indexOf(el) === -1);
Antworten:
Sie können den
this
Parameter derfilter()
Funktion verwenden, um zu vermeiden, dass Ihr Filterarray in einer globalen Variablen gespeichert wird.quelle
this
.this
scheint immer undefiniert zu sein?! SeltsamIch würde wie folgt tun;
quelle
const filteredResults = this.state.cards.filter( result => !this.state.filterOut.includes(result.category) )
Dabei ist this.state.cards in einem Array von Objekten und this.state.filterOut ein Array von Werten, die dem Schlüssel 'category' in den Objekten entsprechen, die Ich wollte entfernen.Im Rückruf prüfen Sie, ob jeder Wert von in
array
istanotherOne
https://jsfiddle.net/0tsyc1sx/
Wenn Sie verwenden
lodash.js
, verwenden Sie_.difference
Demo
Wenn Sie eine Reihe von Objekten haben:
Demo-Array von Objekten
Demo Diff Array von Objekten mit lodash
quelle
id
inanotherOne_el.id == array_el.id
mit dem, was der Schlüssel Sie in Ihrem eigenen Objekt haben. Sie sollten Kenntnisse über Arrays und Objekte in Javascript erhalten, es wird Ihnen helfen, die Antwort besser zu verstehenquelle
Der folgende Code ist der einfachste Weg, ein Array in Bezug auf ein anderes Array zu filtern. Beide Arrays können Objekte anstelle von Werten enthalten.
Ausgabe:
[3, 6]
quelle
Es gibt viele Antworten auf Ihre Frage, aber ich sehe niemanden, der Lambda-Ausdruck verwendet:
quelle
Alle oben genannten Lösungen "funktionieren", sind jedoch für die Leistung nicht optimal und nähern sich dem Problem auf dieselbe Weise, indem alle Einträge an jedem Punkt mithilfe von Array.prototype.indexOf oder Array.prototype.includes linear durchsucht werden . Eine weitaus schnellere Lösung (in den meisten Fällen sogar viel schneller als eine binäre Suche) besteht darin, die Arrays zu sortieren und weiterzumachen, wie unten dargestellt. Ein Nachteil ist jedoch, dass alle Einträge im Array Zahlen oder Zeichenfolgen sein müssen. In einigen seltenen Fällen kann die binäre Suche jedoch auch schneller sein als die progressive lineare Suche. Diese Fälle ergeben sich aus der Tatsache, dass meine progressive lineare Suche eine Komplexität von O (2n 1 + n 2 ) hat (nur O (n 1)+ n 2 ) in der schnelleren C / C ++ - Version) (wobei n 1 das gesuchte Array und n 2 das Filterarray ist), während die binäre Suche eine Komplexität von O hat (n 1 Ceil (log 2 n 2 )) ( Ceil = Aufrunden - bis zur Decke ), und schließlich weist der Index der Suche eine sehr variable Komplexität zwischen O (n 1 ) und O (n 1 n 2 ) auf , die sich zu O (n 1 Ceil (n 2) ergibt ÷ 2)) . Somit ist indexOf im Durchschnitt nur in den Fällen von am schnellsten(n 1 , n 2 ) gleich {1,2} , {1,3} oder {x, 1 | x∈N} . Dies ist jedoch immer noch keine perfekte Darstellung moderner Hardware. IndexOf ist von Haus aus in dem in den meisten modernen Browsern denkbaren Umfang optimiert und unterliegt daher den Gesetzen der Verzweigungsvorhersage . Wenn wir also bei indexOf die gleiche Annahme treffen wie bei der progressiven linearen und binären Suche - dass das Array vorsortiert ist -, können wir gemäß den im Link aufgeführten Statistiken für IndexOf eine ungefähr 6-fache Beschleunigung erwarten. Verschiebung seiner Komplexität zwischen O (n 1 ÷ 6) und O (n 1 n 2 )Mittelwertbildung auf O (n 1 Ceil (n 2 7 ÷ 12)) . Beachten Sie schließlich, dass die folgende Lösung niemals mit Objekten funktioniert, da Objekte in JavaScript nicht durch Zeiger in JavaScript verglichen werden können.
Weitere Informationen zum verwendeten binären Suchalgorithmus finden Sie in meinem anderen Beitrag hier
Wenn Sie in Bezug auf die Dateigröße zimperlich sind (was ich respektiere), können Sie ein wenig Leistung opfern, um die Dateigröße erheblich zu reduzieren und die Wartbarkeit zu verbessern.
Lassen Sie uns einige JSPerfs untersuchen, um den Geschwindigkeitsunterschied zu beweisen. Zum Filtern eines Arrays mit 16 Elementen ist die binäre Suche ungefähr 17% schneller als indexOf, während filterArrayByAnotherArray ungefähr 93% schneller als indexOf ist. Zum Filtern eines Arrays mit 256 Elementen ist die binäre Suche ungefähr 291% schneller als indexOf, während filterArrayByAnotherArray ungefähr 353% schneller als indexOf ist. Zum Filtern eines Arrays von 4096 Elementen ist die binäre Suche ungefähr 2655% schneller als indexOf, während filterArrayByAnotherArray ungefähr 4627% schneller als indexOf ist.
Rückwärtsfilterung (wie ein UND-Gatter)
Der vorherige Abschnitt enthielt Code, um Array A und Array B zu übernehmen und alle in B vorhandenen Elemente aus A zu entfernen:
Dieser nächste Abschnitt enthält Code für die Rückwärtsfilterung, in dem alle Elemente aus A entfernt werden, die in B NICHT vorhanden sind. Dieser Vorgang entspricht funktional nur der Beibehaltung der für A und B gemeinsamen Elemente wie ein UND-Gatter:
Hier ist der Code für die Rückwärtsfilterung:
Die langsamere kleinere Version des Umkehrfiltercodes finden Sie unten.
quelle
Die OA kann auch wie folgt in ES6 implementiert werden
ES6:
quelle
Die beste
filter
Funktionsbeschreibung lautet https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/filterSie sollten einfach die Funktion konditionieren:
Und Sie können nicht auf den Variablenwert zugreifen, bevor er zugewiesen wurde
quelle
Sie können die Filterfunktion so einrichten, dass sie über das "Filterarray" iteriert.
quelle
Sie können den Filter verwenden und dann für die Filterfunktion eine Reduzierung des Filterarrays verwenden, das true überprüft und zurückgibt, wenn es eine Übereinstimmung findet, und dann bei return (!) Invertiert. Die Filterfunktion wird einmal pro Element im Array aufgerufen. Sie führen keinen Vergleich der Elemente in der Funktion in Ihrem Beitrag durch.
quelle
quelle
quelle
Ein flexibleres Filterarray aus einem anderen Array, das Objekteigenschaften enthält
quelle
Sie können eine generische filterByIndex () -Funktion schreiben und die Typinferenz in TS verwenden, um den Aufwand mit der Rückruffunktion zu sparen:
Angenommen, Sie haben Ihr Array [1,2,3,4], das Sie mit den im Array [2,4] angegebenen Indizes filtern möchten ().
Die Funktion byIndex erwartet die Elementfunktion und ein Array und sieht folgendermaßen aus:
Ergebnis ist dann
quelle
In den folgenden Beispielen wird
new Set()
ein gefiltertes Array erstellt, das nur eindeutige Elemente enthält:Array mit primitiven Datentypen: Zeichenfolge, Zahl, Boolescher Wert, Null, undefiniert, Symbol:
Array mit Objekten als Elemente:
quelle
Unten ist ein Beispiel
quelle
Die Lösung von Jack Giffin ist großartig, funktioniert aber nicht für Arrays mit Zahlen größer als 2 ^ 32. Im Folgenden finden Sie eine überarbeitete, schnelle Version zum Filtern eines Arrays basierend auf Jacks Lösung, die jedoch für 64-Bit-Arrays funktioniert.
quelle