Ich weiß, dass ich es mit Schleifen machen kann, aber ich versuche einen eleganten Weg zu finden, dies zu tun:
Ich habe zwei Arrays:
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
Ich möchte damit lodash
bestätigen, dass die beiden oben genannten Arrays identisch sind. Mit "das Gleiche" meine ich, dass es keinen Gegenstand array1
gibt, der nicht in enthalten ist array2
.
In Bezug auf die Überprüfung der Gleichheit zwischen diesen Elementen:
['a', 'b'] == ['b', 'a']
oder
['a', 'b'] == ['a', 'b']
Beide funktionieren, da die Buchstaben immer in Ordnung sind.
quelle
.sort()
hinweisen , dass sie mutieren, und Optionen zum Kopieren zuerst vorgeschlagen, wenn dies ein Problem für den Benutzer ist._.isEqual(_.sortBy(array1), _sortBy(array2))
, um eine Mutation zu verhindern.Sie können lodashs verwenden
xor
für dieseWenn Sie Array [1, 1] als anders als Array [1] betrachten, können Sie die Leistung ein wenig verbessern:
quelle
_.xor([3,4], [4,3]).length == 0
du es tust, wirst du wahr.Sie könnten () und Differenz () für diesen Einsatz Flatten, die gut funktioniert , wenn Sie es egal, ob es Elemente in
array2
die nicht sind inarray1
. Es hört sich so an, als würden Sie fragen, ob Array1 eine Teilmenge von Array2 ist .quelle
Hier gibt es bereits Antworten, aber hier ist meine reine JS-Implementierung. Ich bin mir nicht sicher, ob es optimal ist, aber es ist sicher transparent, lesbar und einfach.
Das Grundprinzip in
contains()
ist, dass, wenna
alle Elemente von enthalten sindb
, das Einfügen in dieselbe Menge die Größe nicht ändern würde.Zum Beispiel, wenn
const a = [1,2,3,4]
undconst b = [1,2]
dannnew Set([...a, ...b]) === {1,2,3,4}
. Wie Sie sehen können, enthält die resultierende Menge dieselben Elemente wiea
.Um es übersichtlicher zu gestalten, können wir es von dort aus auf Folgendes reduzieren:
quelle
PURE JS (funktioniert auch, wenn Arrays und Subarrays mehr als 2 Elemente mit beliebiger Reihenfolge haben). Wenn Zeichenfolgen die
,
Verwendung alsjoin('-')
Parameterzeichen enthalten (kann utf sein), das in Zeichenfolgen nicht verwendet wirdCode-Snippet anzeigen
quelle
Wir können die
_.difference
Funktion verwenden, um festzustellen, ob es einen Unterschied gibt oder nicht.Ich hoffe, dies wird dir helfen.
quelle
true
fürconsole.log(isSame([1,2], [2,3,1]));
a
undb
Variablen zu haben. Sie verwenden nur diese Variablen innerhalb desif-then
Teils, und als erstes verwerfen Sie die in Zeile 2 geladenen Werte. Ich denke, die folgende einzelne Zeile funktioniert genauso :return arrayOne.length <= arrayTwo.length && _.isEmpty(_.difference(arrayTwo.sort(), arrayTwo.sort());
. Und das<=
kann auch verbessert werden===
._.difference
gibt fehlende Elemente des 1. Arguments zurück, aber keine fehlenden Elemente des 2. Arguments. Dies wird also fälschlicherweise zurückgegeben,true
wenn Sie Elemente am 1. in 2. wiederholen :isSame([1, 2, 3], [1, 2, 2])
.Bearbeiten: Ich habe den mehrdimensionalen Aspekt dieser Frage übersehen, daher lasse ich dies hier, falls es den Leuten hilft, eindimensionale Arrays zu vergleichen
Es ist eine alte Frage, aber ich hatte Probleme mit der Geschwindigkeit der Verwendung von
.sort()
odersortBy()
, also habe ich diese stattdessen verwendet:Es sollte schnell scheitern und funktioniert für meine Zwecke einwandfrei.
quelle
array1.every((str) => array2.includes(str))
sollte genug sein. Auch das OP wollte lodash verwenden, sollten Sie zumindest sagen, warum Sie eine VanillaJS-Lösung vorschlagen (... jetzt, wo wir alle haben und einschließen ...). Bitte geben Sie auch ein Beispiel an, wie Sie Ihre Funktion auf das bereitgestellte Problem anwenden können (zweidimensionale Arrays).lodash methods to compare arrays without considering order
nach einer Alternative im modernen Javascript sucht . Die zweite Prüfung ist erforderlich, daarraysContainSameStrings(['1', '2', '2'], ['1', '2', '3'])
sonst true zurückgegeben würde. Ich werde es hier lassen, da es vielleicht hilft, aber ich schätze, dass ich die Frage nicht beantwortet habe