Einfachste code für array-Kreuzung in javascript
Was ist der einfachste, in der Bibliothek-gratis-code für die Implementierung der array-Schnittstellen in javascript? Ich möchte schreiben
intersection([1,2,3], [2,3,4,5])
bekommen und
[2, 3]
Wollen Sie einfach oder schnell?
Priorität ist einfach, aber es kann nicht so hirntot, dass es eine Leistung hog 🙂
ich habe ein JsFiddle Banchmark test-Seite für alle Methoden hier, darunter die _underscore Kreuzung - Funktion. (mehr ist besser) !geben Sie eine Bild Beschreibung hier Bis jetzt intersect_safe gab die besten Ergebnisse. SIE & Unterstreichen die schlimmsten.
Hinzufügen eines
Im Fall, dass Sie es vermissen : die einfachste Antwort ist nicht akzeptiert, sondern derjenige, der eine in der unteren : stackoverflow.com/questions/1885557/...
Priorität ist einfach, aber es kann nicht so hirntot, dass es eine Leistung hog 🙂
ich habe ein JsFiddle Banchmark test-Seite für alle Methoden hier, darunter die _underscore Kreuzung - Funktion. (mehr ist besser) !geben Sie eine Bild Beschreibung hier Bis jetzt intersect_safe gab die besten Ergebnisse. SIE & Unterstreichen die schlimmsten.
Hinzufügen eines
break
zu Simple js loops
erhöht die ops/sec auf ~10MIm Fall, dass Sie es vermissen : die einfachste Antwort ist nicht akzeptiert, sondern derjenige, der eine in der unteren : stackoverflow.com/questions/1885557/...
InformationsquelleAutor Peter | 2009-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie eine Kombination von
Array.der Prototyp.- filter
undArray.der Prototyp.indexOf
:Ja, aber es war erwähnenswert.
Beste Antwort hier, sowohl für die Einfachheit und die Arbeit mit nicht-zahlen
intersection([1,2,1,1,3], [1])
zurück[1, 1, 1]
. Sollte es nicht zurück nur[1]
?Statt
array2.indexOf(n) != -1
kann man auch schreibenarray2.includes(n)
noch einfacher code.InformationsquelleAutor Anon.
Destruktiv scheint, die einfachste, vor allem, wenn wir davon ausgehen, das die Eingabe sortiert ist:
Zerstörungsfreie hat um ein Haar komplizierter, da haben wir zu verfolgen Indizes:
intersect_safe
:length
ist eine Eigenschaft, die in Arrays, nicht eine Methode. Es gibt eine undelared variablei
imresult.push(a[i]);
. Endlich, das funktioniert einfach nicht im Allgemeinen Fall: zwei Objekte, wo keiner ist größer als der andere nach der>
Betreiber sind nicht unbedingt gleich.intersect_safe( [ {} ], [ {} ] )
zum Beispiel, geben wird (sobald die zuvor genannten Fehler behoben werden) ein array mit einem element, das ist eindeutig falsch.Sie können auch
.slice(0)
zu erstellen, die ein Klon des Arrays inintersect_safe
eher als tracking-Indizes.Schau dir die Daten. Meine Antwort war 2009. Die, die Sie verbunden war in 2011.
bitte sei vorsichtiger mit Ihren nicht-so-subtile Vorwürfe, plagarism in die Zukunft. Es ist sehr beleidigend zu Unrecht beschuldigt werden. Vor allem, wenn der ursprüngliche Autor
Entschuldigung angenommen. Und ich Stimme voll und ganz mit Ihr zugrunde liegende position 🙂
InformationsquelleAutor atk
Wenn in Ihrer Umgebung unterstützt ECMAScript 6, Setzen, eine einfache und vermeintlich effizient (siehe link-Spezifikation) Weg:
Kürzer, aber weniger lesbar (auch ohne eine zusätzliche Kreuzung
Set
):Vermeidung einer neuen
Set
ausb
jedes mal:Beachten Sie, dass bei der Verwendung von sets, erhalten Sie nur eindeutige Werte, so
new Set[1,2,3,3].size
ausgewertet3
.[...setA]
syntax? Einige Besondere Art von javascript-operation?Verteilt ist die syntax und in diesem Fall ist es nur verwendet wird, um zu erstellen ein array aus den Elementen in der Menge. "Array.aus(setA)" würde auch in diesem Fall, aber da die Frage für die "einfachste" ich habe versucht, Sie übersichtlicher zu Lesen, in der Zeile. Auf diese Angelegenheit, ich denke, der code könnte einfacher sein, so werde ich update das snippet.
Ich bin neugierig: warum hast du das "Klonen" - array ein? #filter nicht zerstören den ursprünglichen array an, richtig? Es wird ein neues array erstellt?
Ich erstellt einfach ein array aus dem set, um Duplikate entfernen, andernfalls mit dem array direkt führen würde, bei der Rückkehr von Duplikaten. Zum Beispiel, wenn ich das array direkt, intersect([1,2,2,4],[2,3]) ergeben würde [2, 2].
"Beachten Sie, dass die set-Implementierung erlaubt nur eindeutige Werte" - das ist die wörtliche definition eines
Set
, nicht eine Implementierung detail.InformationsquelleAutor nbarbosa
Mit Underscore.js oder lodash.js
Mein Fehler für fehlende, die.Vielen Dank für Hinweise
In jedem Fall ist dies die top-google-listing für diese Suche, so dass eine Bibliothek, die Antwort ist hilfreich. Danke.
Ich bin auch froh, dass dies geschrieben wurde. Erste mal habe ich das Gefühl, die Notwendigkeit für underscore.js. In der Regel JavaScript-Karte und verringern die pipelines machen den job aus, aber dieses mal nicht.
Ich <3 Unterstrich und ich <3 Jeremy Ashkenas (seinem Schöpfer), aber auch so empfehle ich Check-out Lodash statt. Es ist im Grunde eine verbesserte version der Unterstrich (es war ursprünglich ein fork), dessen einzige Nachteil ist, dass super-optimierten (und damit fast nicht lesbar) - source-code. Der Unterstrich Menschen selbst betrachtet loszuwerden Unterstrich ganz (und nur Leute verwenden, Lodash), aber Leute, die sich über source-code-Lesbarkeit argumentiert, um es zu halten (ich war auf dieser Seite sogar, aber ich hab da Umgerechnet auf Lodash). @see github.com/jashkenas/underscore/issues/2182
InformationsquelleAutor Sai Ram
Wie wäre es einfach mit assoziativen arrays?
edit:
Object.prototype
.Die OP ' s Beispiel war die Verwendung von zahlen, und wenn Sie ein Skript Durcheinander gebracht hat mit dem Objekt.Prototyp dann sollte das script umgeschrieben werden, oder entfernt werden.
Sie brauchen nicht beide (d1) und (d2). Erstellen (d2), dann eine Schleife durch (a) anstatt einer Schleife durch (d1).
danke, ich glaube du hast Recht.
Sollte
d[b[i]] = true;
stattd[b[j]] = true;
(i
nichtj
). Aber Bearbeiten benötigt 6 chars.InformationsquelleAutor Steven Huwig
Die Leistung von @atk-Umsetzung für sortierte arrays von primitiven mit verbessert werden kann .pop statt .shift.
Erstellte ich einen benchmark mit jsPerf: http://bit.ly/P9FrZK. Es ist etwa drei mal schneller .pop.
Beachten Sie, dass, wenn Sie ersetzen
a[aLast] > b[bLast]
mita[aLast].localeCompare(b[bLast]) > 0
(und gleichzeitig mit derelse if
unten) dann funktioniert das auf strings.Die Geschwindigkeit hängt von der Größe des arrays, da
.pop
ist O(1) und.shift()
ist O(n)InformationsquelleAutor xn.
Mit jQuery:
c = $(b).filter(a);
, aber ich würde nicht empfehlen, unter Berufung auf jQuery für diese Art von array-manipulation, da die Dokumentation erwähnt nur, dass es funktioniert für Elemente.Diese gibt keine Antwort auf Ops Frage: "Was ist das einfachste, die Bibliothek-kostenlos code..."
InformationsquelleAutor Gowsikan
Etwas wie das, Nicht getestet, gut aber.
PS:Der Algorithmus nur für Zahlen und Normale Strings, die Schnittmenge von beliebigen Objekt-arrays kann nicht funktionieren.
Wenn das array nicht sortiert sind, müssen, um eine Schleife rund 1.000.000 mal, wenn Sie sich überschneiden 1000 Länge-array x 1000 Länge-array
Ich denke, Sie verpasst mein Punkt, der ist, dass beliebige Objekte in JavaScript haben keine Natürliche Reihenfolge Sortieren, was bedeutet, dass das Sortieren eines Arrays von beliebigen Objekten wird nicht dazu führen, gleich gruppierten Objekte. Es ist nicht gut, dass ein effizienter Algorithmus, das funktioniert nicht.
Ah sorry, habe ich verpasst "beliebige Objekte", ja, Du hast Recht. diese Objekt können nicht sortiert werden, und der Algorithmus funktioniert möglicherweise nicht auf diese.
InformationsquelleAutor YOU
Für arrays, die nur strings oder zahlen, die Sie tun können, etwas mit der Sortierung, wie pro einige der anderen Antworten. Für den Allgemeinen Fall eines arrays von beliebigen Objekten ich glaube nicht, dass Sie vermeiden können, tut es der lange Weg. Im folgenden erhalten Sie die Kreuzung eine beliebige Anzahl von arrays als Parameter bereitgestellt, um
arrayIntersection
:Na ja, aber ich denke, das ist, was scheint natürlicher für die meisten Menschen. Es ist auch trivial, um plug-in eine alternative Funktion eine unterschiedliche Gleichheit testen.
Ich glaube, Sie sind versehentlich erstellen eine Globale variable firstArr in deinem Beispiel.
Du hast Recht, danke. Klar meine Meinung geändert, ob Sie nennen Sie die variable
firstArr
oderfirstArray
und nicht aktualisieren, alle Referenzen. Behoben.InformationsquelleAutor Tim Down
Einem kleinen zwicken, um die kleinste hier (die filter/indexOf-Lösung), nämlich der Erstellung eines index der Werte in einem der arrays über ein JavaScript-Objekt, wird es reduzieren von O(N*M) , "wahrscheinlich" lineare Zeit. Quelle 1 source2
Dies ist nicht der einfachsten Lösung (es ist mehr code als filter+indexOf), noch ist es die Schnellste Methode für die (wahrscheinlich langsamer durch einen Konstanten Faktor als intersect_safe()), aber scheint wie eine ziemlich gute balance. Es ist auf der sehr einfache Seite, während Sie eine gute Leistung, und es erfordert keine pre-sortierte Eingaben.
InformationsquelleAutor David
Anderen indizierten Ansatz verarbeiten zu können eine beliebige Anzahl von arrays auf einmal:
Es funktioniert nur für die Werte, die ausgewertet werden können als strings, und Sie sollten vergehen, als ein array wie:
...aber es transparent akzeptiert Objekte als parameter oder als beliebige Elemente werden geschnitten (immer wiederkehrenden Reihe von gemeinsamen Werten). Beispiele:
EDIT: ich habe gerade bemerkt, dass dies, in einer Weise, die leicht buggy.
Ist: ich codiert es zu denken, dass Eingabe-arrays nicht selbst enthalten Wiederholungen (als Beispiel nicht).
Aber wenn Eingabe-arrays zufällig enthalten Wiederholungen, das würde produzieren falsche Ergebnisse. Beispiel (unter implementation):
Glücklicherweise ist dies einfach zu beheben, indem man einfach die zweite Stufe der Indizierung. Das heißt:
Ändern:
durch:
...und:
durch:
Komplettes Beispiel:
var v =
Zeile hinzufügenif (typeof v == 'function') continue;
und springt zum hinzufügen von Funktionen auf die Ergebnisse. Danke!Danke @Zsolti. Ich glaube nicht, fügen Sie Ihrem Vorschlag, weil mit Funktionen (und die Art, wie wir damit umgehen wollen) wird aus dem Geltungsbereich der ursprünglichen Frage. Aber siehe mein edit: Wenn Sie können, haben Wiederholungen in der Eingabe-arrays, dann die original-Implementierung fehlerhaft ist. Ich habe es fest in meinem edit. ...Auf der anderen Seite, wenn Sie wissen, für sicher, dass es keine Wiederholung der ursprünglichen Implementierung ist etwas billiger.
...über die Funktionen, Sie kann auch geschnitten: Wenn wir erkennen, wie @Zsolti sagt (mit
if (typeof v == 'function')
, dann können wir seine stringification (v.toString()
) als Schlüssel für den index. Aber wir müssen etwas tun, um es zu bewahren intakt. Der einfachste Weg dies zu tun ist, weisen Sie einfach die ursprüngliche Funktion als Wert statt einem einfachen booleschen Wert true. Aber, in diesem Fall, die neueste deindexaton sollte auch verändert, um diesen Zustand zu erkennen und wiederherstellen den richtigen Wert (mit der Funktion).Wie schnell kann dieser mit 30-arrays mit 100 Elementen.. wie ist die CPU-Auslastung?
InformationsquelleAutor bitifet
InformationsquelleAutor Gabe
Mit einigen Einschränkungen, die auf Ihre Daten haben, können Sie es tun in lineare Zeit!
Für positive ganze zahlen: verwenden Sie ein array zuordnen der Werte zu einem "gesehen/nicht gesehen" boolean".
Es ist eine ähnliche Technik für Objekte: nehmen Sie einen dummy-Schlüssel, setzen Sie ihn auf "true" für jedes element aus Matrix1, dann suchen Sie diese Taste im Elemente Matrix2. Aufräumen, wenn du fertig bist.
Natürlich müssen Sie sicherstellen, dass der Schlüssel nicht erscheinen, sonst werden Sie zu zerstören Ihre Daten...
Interessante Lösung, wie ich es mag. Die meisten anderen Lösungen sind O(n^2), aber das ist O(n). Ich habe den integer-code ericP Leistung fiddle hier jsfiddle.net/321juyLu/2. Es kam 3., me likey 🙂
InformationsquelleAutor tarulen
Werde ich beitragen mit dem, was hat am besten für mich:
InformationsquelleAutor Johan
"indexOf" für den IE 9.0, chrome, firefox, opera,
InformationsquelleAutor Martin Roberto Mondragon Sotel
Einfachheit halber:
Vorteile:
Nachteile:
Würden Sie nicht wollen, verwenden Sie diese für die 3D-engine oder kernel arbeiten, aber wenn Sie Probleme haben, diese zu führen in ein Ereignis-basierte app, Ihr design hat größere Probleme.
InformationsquelleAutor Norguard
.reduce
eine Karte zu erstellen, und.filter
zu finden, um die Kreuzung.delete
innerhalb der.filter
ermöglicht uns die Behandlung der zweiten Reihe, als ob es einen eindeutigen Satz.Ich finde dieses Vorgehen ziemlich leicht zu Grunde geht. Es führt in konstanter Zeit.
InformationsquelleAutor Belden
Hier ist underscore.js Umsetzung:
Quelle: http://underscorejs.org/docs/underscore.html#section-62
InformationsquelleAutor Dorian
{
undreturn
; d.h.listA.filter(a => listB.some(b => b === a))
-- (obwohl die Verwendung von ES6+ code davon ausgegangen, dass es entweder transpiled zu ES5, oder nur einmal auf einen modernen Motor/browser)ja, Sie ' uns ' re rigth
InformationsquelleAutor jcmordan
InformationsquelleAutor bekzat
Hier ist eine sehr naive Implementierung, die ich verwende. Es ist nicht-destruktiv und macht auch sicher, dass keine doppelten Einträge.
InformationsquelleAutor devios1
Kreuzung von N-arrays in coffeescript
InformationsquelleAutor user1205224