Ich habe ein Zielarray ["apple","banana","orange"]
und möchte überprüfen, ob andere Arrays eines der Zielarrayelemente enthalten.
Zum Beispiel:
["apple","grape"] //returns true;
["apple","banana","pineapple"] //returns true;
["grape", "pineapple"] //returns false;
Wie kann ich das in JavaScript machen?
javascript
arrays
Alex
quelle
quelle
for
Schleife und iterieren Sie über das Zielarray. Wenn jedes Element im aktuellen Array enthalten ist (verwendencurrent.indexOf(elem) !== -1)
, dann sind alle darin enthalten.Antworten:
Vanilla JS
ES2016:
ES6:
Wie es funktioniert
some(..)
Überprüft jedes Element des Arrays anhand einer Testfunktion und gibt true zurück, wenn ein Element des Arrays die Testfunktion besteht. Andernfalls wird false zurückgegeben.indexOf(..) >= 0
undincludes(..)
beide geben true zurück, wenn das angegebene Argument im Array vorhanden ist.quelle
true
ob ein Element des Arrays die Testfunktion besteht. Andernfalls wird es zurückgegebenfalse
.[false, false, false]
anstelle eines leeren Arrays ist[]
?Vanille js
quelle
some()
ist rad. Beendet, sobald etwas passt.arr.some(v=> haystack.indexOf(v) >= 0)
arr.some(v => haystack.includes(v))
arr1.some(v => arr2.indexOf(v) >= 0)
.includes
, da sie anscheinend im IE nicht unterstützt wird: stackoverflow.com/questions/36574351/…Wenn Sie nicht gegen die Verwendung eines Librays sind, verfügt http://underscorejs.org/ über eine Schnittmethode, die dies vereinfachen kann:
Die Schnittfunktion gibt ein neues Array mit den Elementen zurück, mit denen es übereinstimmt, und wenn es nicht übereinstimmt, gibt es ein leeres Array zurück.
quelle
ES6 (am schnellsten)
ES2016
Unterstreichen
DEMO: https://jsfiddle.net/r257wuv5/
jsPerf: https://jsperf.com/array-contains-any-element-of-another-array
quelle
Wenn Sie (aufgrund der Verwendung von
indexOf
) keinen Typenzwang benötigen , können Sie Folgendes versuchen:Wo
arr
enthält die Zielelemente. Am Endefound
wird angezeigt, ob das zweite Array mindestens eine Übereinstimmung mit dem Ziel hatte.Natürlich können Sie Zahlen gegen alles austauschen, was Sie verwenden möchten - Zeichenfolgen sind in Ordnung, wie in Ihrem Beispiel.
In meinem speziellen Beispiel sollte das Ergebnis sein,
true
dass das zweite Array3
im Ziel vorhanden ist.AKTUALISIEREN:
So würde ich es in eine Funktion organisieren (mit einigen geringfügigen Änderungen gegenüber zuvor):
DEMO: http://jsfiddle.net/u8Bzt/
In diesem Fall könnte die Funktion so geändert werden, dass
targetArray
sie als Argument übergeben wird, anstatt im Abschluss fest codiert zu werden.UPDATE2:
Während meine obige Lösung möglicherweise funktioniert und (hoffentlich besser) lesbar ist, glaube ich, dass der "bessere" Weg, mit dem von mir beschriebenen Konzept umzugehen, darin besteht, etwas anderes zu tun. Das "Problem" bei der obigen Lösung besteht darin, dass das
indexOf
Zielarray innerhalb der Schleife für jedes Element im anderen Array vollständig durchlaufen wird. Dies kann leicht durch "Nachschlagen" (eine Karte ... ein JavaScript-Objektliteral) "behoben" werden. Dies ermöglicht zwei einfache Schleifen über jedes Array. Hier ist ein Beispiel:DEMO: http://jsfiddle.net/5Lv9v/
Der Nachteil dieser Lösung ist, dass nur Zahlen und Zeichenfolgen (und Boolesche Werte) (korrekt) verwendet werden können, da die Werte (implizit) in Zeichenfolgen konvertiert und als Schlüssel für die Lookup-Map festgelegt werden. Dies ist für nicht wörtliche Werte nicht gerade gut / möglich / einfach.
quelle
undefined
... dafür ist das da!!
" - das ist falsch. Es wird die boolesche Opposition von zurückgeben!
.ES6-Lösung:
Im Gegensatz dazu: Muss enthält alle Werte.
Hoffe, wird hilfreich sein.
quelle
Sie könnten lodash verwenden und tun:
Die Schnittmenge wird für beide Sammlungen festgelegt, wodurch ein Array identischer Elemente erzeugt wird.
quelle
intersection
der Vergleich auch nach der Suche nach der ersten Übereinstimmung fortgesetzt wird, um alle zu finden. Es ist wie zu verwenden,filter
wenn Sie nur brauchenfind
.Verwenden von filter / indexOf :
quelle
Oder Sie können sogar eine bessere Leistung erzielen, wenn Sie zuerst herausfinden, welches dieser beiden Arrays länger ist und
Set
das längste Array erkennen, während Sie diesome
Methode auf das kürzeste anwenden :quelle
indexOf
undincludes
sind Sie die erste mit der effizienteren Set-basierten Lösung zu beantworten, mit dem nativenSet
, 4 Jahre , nachdem sie in EcmaScript eingeführt wurde. +1Ich fand diese kurze und süße Syntax so, dass alle oder einige Elemente zwischen zwei Arrays übereinstimmen. Zum Beispiel
// ODER Operation. Finden Sie heraus, ob eines der Elemente array2 in array1 vorhanden ist. Dies wird zurückgegeben, sobald eine erste Übereinstimmung vorliegt, da einige Methoden unterbrochen werden, wenn die Funktion TRUE zurückgibt
// druckt TRUE
// UND-Operation. Finden Sie heraus, ob alle Array2-Elemente in Array1 vorhanden sind. Dies wird zurückgegeben, sobald keine erste Übereinstimmung vorliegt, da einige Methoden unterbrochen werden, wenn die Funktion TRUE zurückgibt
// druckt FALSE
Hoffe das hilft jemandem in Zukunft!
quelle
Sie können einen verschachtelten Array.prototype.some-Aufruf verwenden. Dies hat den Vorteil, dass es beim ersten Spiel anstelle anderer Lösungen, die die gesamte verschachtelte Schleife durchlaufen, auf Kaution geht.
z.B.
quelle
Hier ist ein interessanter Fall, den ich teilen sollte.
Angenommen, Sie haben ein Array von Objekten und ein Array ausgewählter Filter.
Um die ausgewählten Filter auf diese Struktur anzuwenden, können wir
quelle
Ich habe 3 Lösungen geschrieben. Im Wesentlichen machen sie das Gleiche. Sie kehren wahr zurück, sobald sie bekommen
true
. Ich habe die 3 Lösungen geschrieben, nur um 3 verschiedene Arten zu zeigen, Dinge zu tun. Jetzt kommt es darauf an, was du mehr magst. Sie können performance.now () verwenden können Sie die Leistung der einen oder anderen Lösung überprüfen. In meinen Lösungen überprüfe ich auch, welches Array das größte und welches das kleinste ist, um die Operationen effizienter zu gestalten.Die 3. Lösung ist möglicherweise nicht die süßeste, aber effizient. Ich habe beschlossen, es hinzuzufügen, da Sie in einigen Codierungsinterviews keine integrierten Methoden verwenden dürfen.
Schließlich sicher ... können wir eine Lösung mit 2 NESTED for-Schleifen (Brute-Force-Methode) finden, aber Sie möchten dies vermeiden, da die zeitliche Komplexität schlecht ist. O (n ^ 2) .
Hinweis:
indexOf () vs include ()
Welches hat eine bessere Leistung ?
indexOf()
für ein bisschen, aber enthält ist meiner Meinung nach besser lesbar.Wenn ich mich nicht irre
.includes()
undindexOf()
hinter den Kulissen Schleifen verwende, sind Sie bei der Verwendung mit O (n ^ 2).some()
.USING-Schleife
USING .some ()
VERWENDEN VON KARTEN Zeitkomplexität O (2n) => O (n)
Code in meinem: stackblitz
Ich bin weder ein Experte für Leistung noch für BigO. Wenn also etwas, das ich gesagt habe, nicht stimmt, lassen Sie es mich wissen.
quelle
Was ist mit einer Kombination aus some / findIndex und indexOf?
Also so etwas wie das:
Um die Lesbarkeit zu verbessern, können Sie diese Funktionalität dem Array-Objekt selbst hinzufügen.
Hinweis: Wenn Sie etwas mit einem Prädikat tun möchten, können Sie den inneren indexOf durch einen anderen findIndex und ein Prädikat ersetzen
quelle
Meine Lösung wendet Array.prototype.some () und Array.prototype.includes () an. Array-Helfer an, die ihre Arbeit ebenfalls recht effizient erledigen
ES6
quelle
Nur noch eine Lösung
Überprüfen Sie, ob a1 alle Elemente von a2 enthält
quelle
Dies kann durch einfaches Durchlaufen des Hauptarrays und Überprüfen, ob ein anderes Array eines der Zielelemente enthält oder nicht, erfolgen.
Versuche dies:
DEMO bei JSFIDDLE
quelle
Mit Unterstrichen
quelle
indexOf
ich das Gegenteil denke :). Andererseits stimme ich dem Versuch zu, keine externen Bibliotheken hinzuzufügen, wenn diese nicht wirklich benötigt werden, aber ich bin nicht wirklich besessen davon. Bibliotheken von Drittanbietern bieten nicht nur nützliche Funktionen, sondern auch solide Funktionen. Zum Beispiel: Haben Sie alle Edge-Cases und Mayor-Browser mit Ihrer Lösung getestet? .. (every
versucht übrigens nicht, einen Index in einer Liste zu finden, sondern bewertet in jedem etwas Element der Liste etwas)Hinzufügen zum Array-Prototyp
Haftungsausschluss: Viele würden dringend davon abraten. Das einzige Mal, wenn es wirklich ein Problem wäre, wäre, wenn eine Bibliothek eine Prototypfunktion mit demselben Namen (die sich anders verhält) oder so etwas hinzufügte.
Code:
Ohne Verwendung großer Pfeilfunktionen:
Verwendungszweck
quelle
Vanilla JS mit teilweiser Übereinstimmung und ohne Berücksichtigung der Groß- und Kleinschreibung
Das Problem bei einigen früheren Ansätzen ist, dass sie eine genaue Übereinstimmung jedes Wortes erfordern . Aber was , wenn Sie Ergebnisse für teilweise Übereinstimmungen liefern?
Dies ist nützlich, wenn Sie ein Suchfeld bereitstellen möchten, in dem Benutzer Wörter eingeben und die Ergebnisse diese Wörter in beliebiger Reihenfolge, Position und Groß- / Kleinschreibung enthalten können.
quelle
Aktualisieren Sie die Antwort von @Paul Grimshaw und verwenden Sie
includes
insteed of,indexOf
um die Lesbarkeit zu verbessernquelle
Ich habe eine Lösung für Node mit Unterstrichen wie folgt gefunden:
quelle
Persönlich würde ich die folgende Funktion verwenden:
Die Methode "toString ()" verwendet immer Kommas, um die Werte zu trennen. Funktioniert nur wirklich mit primitiven Typen.
quelle
Das Array .filter () mit einem verschachtelten Aufruf von .find () gibt alle Elemente im ersten Array zurück, die Mitglieder des zweiten Arrays sind. Überprüfen Sie die Länge des zurückgegebenen Arrays, um festzustellen, ob sich eines der zweiten Arrays im ersten Array befindet.
quelle
quelle
quelle