Ich suche nach einer eleganten Methode, um festzustellen, welches Element in einem JavaScript-Array am häufigsten vorkommt ( Modus ).
Zum Beispiel in
['pear', 'apple', 'orange', 'apple']
Das 'apple'
Element ist das häufigste.
javascript
mode
Schraubstock
quelle
quelle
Antworten:
Dies ist nur der Modus. Hier ist eine
schnelle, nicht optimierteLösung. Es sollte O (n) sein.quelle
Seit 2009 gibt es einige Entwicklungen in Javascript - ich dachte, ich würde eine weitere Option hinzufügen. Ich bin weniger mit Effizienz beschäftigt, bis es tatsächlich ein Problem ist, daher begünstigt meine Definition von "elegantem" Code (wie vom OP festgelegt) die Lesbarkeit - was natürlich subjektiv ist ...
Wenn in diesem speziellen Beispiel zwei oder mehr Elemente der Menge gleich vorkommen, wird dasjenige zurückgegeben, das zuletzt im Array angezeigt wird. Es ist auch erwähnenswert, dass dadurch Ihr ursprüngliches Array geändert wird - was verhindert werden kann, wenn Sie dies
Array.slice
vorher mit einem Aufruf wünschen .Edit: das Beispiel mit einigen aktualisiert ES6 Fett Pfeile , weil 2015 passiert ist, und ich denke , sie sehen ziemlich ... Wenn Sie mit der Abwärtskompatibilität betroffen sind können Sie dies finden in der Revisionshistorie .
quelle
Auf
George Jempty's
Anfrage, dass der Algorithmus Bindungen berücksichtigt, schlage ich eine modifizierte Version desMatthew Flaschen's
Algorithmus vor.Dies gibt nun eine Zeichenfolge mit den durch ein
&
Symbol begrenzten Moduselementen zurück. Wenn das Ergebnis empfangen wird, kann es auf dieses&
Element aufgeteilt werden und Sie haben Ihre Modi.Eine andere Möglichkeit wäre, ein Array von Moduselementen wie folgt zurückzugeben:
Im obigen Beispiel könnten Sie dann das Ergebnis der Funktion als Array von Modi behandeln.
quelle
modes
um[array[0]]
als Anfangswert. Dadurch wird sichergestellt, dass Sie Duplikate habenmodes
. Dies sollte den Trick tunvar modes = []
==
zu ändern===
, um strikte Gleichheit durchzusetzenBasierend auf der ES6 + -Antwort von Emissary könnten
Array.prototype.reduce
Sie Ihren Vergleich durchführen (im Gegensatz zum Sortieren, Poppen und potenziellen Mutieren Ihres Arrays), was meiner Meinung nach ziemlich schick aussieht.Ich verwende standardmäßig null, was Ihnen nicht immer eine wahrheitsgemäße Antwort gibt, wenn null eine mögliche Option ist, nach der Sie filtern. Vielleicht könnte dies ein optionales zweites Argument sein
Der Nachteil ist, wie bei verschiedenen anderen Lösungen, dass es keine "Zeichnungszustände" behandelt, aber dies könnte immer noch mit einer etwas komplizierteren Reduktionsfunktion erreicht werden.
quelle
quelle
Hier einen deklarativen Ansatz ausprobieren. Diese Lösung erstellt ein Objekt, um die Vorkommen jedes Wortes zu erfassen. Anschließend wird das Objekt auf ein Array heruntergefiltert, indem die Gesamtvorkommen jedes Wortes mit dem höchsten im Objekt gefundenen Wert verglichen werden.
quelle
Da ich diese Funktion als Quiz für die Interviewer verwende, poste ich meine Lösung:
quelle
Eine weitere JS-Lösung von: https://www.w3resource.com/javascript-exercises/javascript-array-exercise-8.php
Kann das auch versuchen:
quelle
Hier ist eine andere ES6-Methode mit O (n) -Komplexität
quelle
Zeit für eine andere Lösung:
Wenn es auf die Kürze ankommt (nicht), dann:
Wenn nicht vorhandene Mitglieder vermieden werden sollen (z. B. spärliches Array), ist ein zusätzlicher hasOwnProperty- Test erforderlich:
Andere Antworten hier werden undefiniert zurückgegeben .
quelle
Diese Lösung kann mehrere Elemente eines Arrays zurückgeben, wenn sie gleichzeitig auftreten. Beispielsweise hat ein Array arr = [3,4,3,6,4] zwei Moduswerte, 3 und 6.
Hier ist die Lösung,
quelle
quelle
Hier ist meine Lösung für dieses Problem, aber mit Zahlen und unter Verwendung der neuen 'Set'-Funktion. Es ist nicht sehr performant, aber ich hatte definitiv viel Spaß beim Schreiben und es unterstützt mehrere Maximalwerte.
Verwenden Sie dies übrigens nicht für die Produktion. Dies ist nur ein Beispiel dafür, wie Sie es nur mit ES6- und Array-Funktionen lösen können.
quelle
Hier ist meine Lösung: -
quelle
Hinweis: ct ist die Länge des Arrays.
quelle
quelle
quelle
Versuchen Sie es auch, dies berücksichtigt nicht die Browserversion.
quelle
quelle
Hier ist die moderne Version mit integrierten Karten (sie funktioniert also nicht nur mit Dingen, die in eindeutige Zeichenfolgen konvertiert werden können):
quelle
Ich denke, Sie haben zwei Ansätze. Beides hat Vorteile.
Sortieren Sie dann Count oder Loop Through und verwenden Sie eine Hash-Tabelle, um die Zählung für Sie durchzuführen.
Die Hashtabelle ist schön, denn wenn Sie mit der Verarbeitung fertig sind, haben Sie auch alle unterschiedlichen Elemente. Wenn Sie jedoch Millionen von Elementen hatten, könnte die Hash-Tabelle viel Speicherplatz beanspruchen, wenn die Duplizierungsrate niedrig ist. Der Ansatz "Sortieren, dann Zählen" hätte einen viel besser kontrollierbaren Speicherbedarf.
quelle
quelle
Sie können dies versuchen:
quelle
Sie könnten es in O (n) Komplexität lösen
Kopieren Sie einfach die Chrome-Konsole und fügen Sie sie ein, um den obigen Code auszuführen.
quelle
Diese Funktion ist eine generische Funktion für jede Art von Informationen. Es zählt das Auftreten der Elemente und gibt dann ein Array mit maximal auftretenden Elementen zurück.
quelle
quelle
Hier ist mein Weg. Ich versuche, Datenfaust zu gruppieren.
Das groupResult sollte sein
Suchen Sie dann die Eigenschaft mit dem längsten Array
Der vollständige Code sieht aus wie
quelle
quelle
Mit ES6 können Sie die Methode folgendermaßen verketten:
Wenn zwei Elemente dasselbe Vorkommen haben, werden beide zurückgegeben. Und es funktioniert mit jeder Art von Element.
quelle
arr
in einem Bereich verwenden, in dem diese Variable bereits als Parameter definiert ist. Dies kann je nach verwendetem Browser zu Fehlern führen.arr
bezieht sicharr.indexOf(cur)
? Der oberste Parameter oder der innerhalb des Reduzierens?Um einen wirklich einfach zu lesenden, wartbaren Code zu erhalten, teile ich Folgendes:
Hoffe es hilft jemandem;)!
quelle