Was ist der schnellste oder eleganteste Weg, um einen Set-Unterschied mit Javascript-Arrays zu berechnen?
Lassen A
und B
werden zwei Sätze. Ich bin auf der Suche nach wirklich schnell oder elegante Möglichkeiten, um zu berechnen, den Unterschied zwischen (A - B
oder A \B
je nach Präferenz) zwischen Ihnen. Die beiden sets sind gespeichert und manipuliert werden als Javascript-arrays, wie der Titel sagt.
Hinweise:
- Gecko-spezifischen tricks sind okay
- Ich würde lieber kleben, um native Funktionen (aber ich bin offen für ein leichtes Bibliothek, wenn es so schneller)
- Habe ich gesehen, aber nicht getestet, JS.Set (siehe vorherigen Punkt)
Edit: bemerkte ich einen Kommentar über sets mit doppelten Elemente. Wenn ich sage "der Satz" ich beziehe mich auf die mathematische definition, was bedeutet, dass (unter anderem), dass Sie enthalten keine doppelten Elemente.
InformationsquelleAutor der Frage Matt Ball | 2009-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nun, 7 Jahre später, mit ES6 - Set Objekt, es ist ganz einfach (aber immer noch nicht so kompakt wie pythons A - B), und angeblich schneller als
indexOf
für große arrays:InformationsquelleAutor der Antwort milan
Können Sie ein Objekt verwenden, als Karte zu vermeiden Linear scanning
B
für jedes elementA
wie in user187291 Antwort:Den nicht-standard -
toSource()
Methode wird verwendet, um eindeutige Namen für die Eigenschaft; wenn alle Elemente, die bereits eindeutige string-Repräsentationen (wie bei zahlen), können Sie beschleunigen den code, indem Sie dietoSource()
Aufrufe.InformationsquelleAutor der Antwort Christoph
Ich würde hash-array B, dann halten Sie Werte aus dem array A nicht in B:
InformationsquelleAutor der Antwort Eric Bréchemier
Unter Einbeziehung der Idee von Christoph und davon ein paar nicht-standard-Methoden iteration über arrays und Objekte/hashes (
each
und Freunde), können wir festlegen, Differenz, Vereinigung und Schnittmenge in der linearen Zeit in über 20 Linien insgesamt:Dies setzt Voraus, dass
each
undfilter
definiert sind, die für arrays, und wir haben zwei utility-Methoden:myUtils.keys(hash)
: liefert einearray mit den Schlüsseln des hash -
myUtils.select(hash, fnSelector,
: gibt ein array mitfnEvaluator)
die Ergebnisse der Aufruf
fnEvaluator
auf das Schlüssel/Wert-Paare für die
fnSelector
true zurück.Den
select()
ist lose inspiriert von Common Lisp, und ist nurfilter()
undmap()
in eine gerollt. (Es wäre besser, Sie zu haben, definiertObject.prototype
aber so tun, Wracks Verwüstung mit jQuery, also entschied ich mich für statische utility-Methoden.)Performance: Tests mit
gibt zwei sets mit 50.000 und 66,666 Elemente. Mit diesen Werten A-B dauert etwa 75ms, während union und intersektion sind etwa 150mm jeden. (Mac Safari 4.0 mit Javascript-Datum für das timing.)
Ich denke, das ist anständige Belohnung für die 20 Zeilen code.
InformationsquelleAutor der Antwort j-g-faustus
Mit Underscore.js (Bibliothek für funktionales JS)
InformationsquelleAutor der Antwort chribsen
Dies funktioniert, aber ich denke, ein weiterer ist viel mehr kürzer und eleganter zu
InformationsquelleAutor der Antwort Xavi Ivars
Als für die Schnellste Weise, das ist nicht so elegant, aber ich habe einige tests, um sicher zu sein. Laden ein array ein Objekt ist wesentlich schneller zu verarbeiten, in großen Mengen:
Ergebnisse:
Funktioniert dies jedoch mit strings nur. Wenn Sie planen, vergleichen nummerierte sets werden Sie wollen, um anzeigen Ergebnisse mit parseInt.
InformationsquelleAutor der Antwort SmujMaiku
Einige einfache Funktionen, die Kreditaufnahme von @milan Antwort:
Verwendung:
InformationsquelleAutor der Antwort Brian Burns