Zählen des Vorkommens / der Häufigkeit von Array-Elementen
Lesezeit: 5 Minuten
Jack W
In Javascript versuche ich, ein anfängliches Array von Zahlenwerten zu nehmen und die darin enthaltenen Elemente zu zählen. Idealerweise wären das Ergebnis zwei neue Arrays, wobei das erste jedes eindeutige Element angibt und das zweite die Häufigkeit enthält, mit der jedes Element vorkommt. Ich bin jedoch offen für Vorschläge zum Format der Ausgabe.
Wenn das ursprüngliche Array beispielsweise lautete:
5, 5, 5, 2, 2, 2, 2, 2, 9, 4
Dann würden zwei neue Arrays erstellt werden. Der erste würde den Namen jedes eindeutigen Elements enthalten:
5, 2, 9, 4
Die zweite würde die Häufigkeit enthalten, mit der dieses Element im ursprünglichen Array vorkam:
3, 5, 1, 1
Da die Zahl 5 dreimal im Ausgangsarray vorkommt, kommt die Zahl 2 fünfmal vor und 9 und 4 kommen beide einmal vor.
Ich habe viel nach einer Lösung gesucht, aber nichts scheint zu funktionieren, und alles, was ich selbst versucht habe, hat sich als lächerlich komplex herausgestellt. Jede Hilfe wäre willkommen!
Danke 🙂
Wenn Sie nur sehen wollten, ob ein Wert nur einmal vorkommt (statt zwei- oder mehrmals), könnten Sie verwenden if (arr.indexOf(value) == arr.lastIndexOf(value))
– Rodrigo
6. März 2016 um 12:58 Uhr
Wir können benutzen ramda.js um dies auf einfache Weise zu erreichen. const ary = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; R.countBy(r=> r)(ary)
– Eshwar Prasad Yaddanapudi
4. Januar 2017 um 5:50 Uhr
arr.filter(x => x===5).length würden zurückkehren 3 um anzuzeigen, dass es ‘3’ Fünfer im Array gibt.
– noobninja
15. Juni 2020 um 21:21 Uhr
Nehmen wir an, meine Antwort ist ein Array von Objekten
Danke, sehr schöne Lösung 😉 … und um die Arrays “key” und “value” zu erhalten: const keys = Object.keys(a);const values = Object.values(a);
– ncenerar
7. Juni 2020 um 8:15 Uhr
Kurzform: acc[curr] = (acc[curr] || 0) + 1 statt zu verwenden if/else. Sie können die Antwort unten überprüfen
– Nguyễn Văn Phong
28. April 2021 um 5:55 Uhr
hat den Nebeneffekt des Sortierens des Arrays (Nebeneffekte sind schlecht), auch das Sortieren ist O(N log(N)) und der eleganzgewinn lohnt sich nicht
– Ninjagecko
25. Mai 2011 um 17:05 Uhr
In Ermangelung eines netten High-Level-Primitives aus einer Bibliothek eines Drittanbieters würde ich dies normalerweise wie folgt implementieren reduce Antworten. Ich wollte gerade eine solche Antwort einreichen, bevor ich sah, dass sie bereits existierte. Trotzdem die counts[num] = counts[num] ? counts[num]+1 : 1 Antwort funktioniert auch (entspricht der if(!result[a[i]])result[a[i]]=0 Antwort, die eleganter, aber weniger leicht zu lesen ist); Diese Antworten können geändert werden, um eine “schönere” Version der for-Schleife zu verwenden, vielleicht eine for-Schleife eines Drittanbieters, aber ich habe das irgendwie ignoriert, da die standardmäßigen indexbasierten for-Schleifen leider die Standardeinstellung sind.
– Ninjagecko
25. Mai 2011 um 18:51 Uhr
Bei kleinen Arrays kann das Sortieren an Ort und Stelle schneller sein als das Erstellen eines assoziativen Arrays.
– quant_dev
29. September 2017 um 20:24 Uhr
@ŠimeVidas Ich habe einen Haftungsausschluss hinzugefügt Array.sort, weil das Fehlen dieser Tatsache mich in echten Code gestürzt hat. (Es ist leicht, es naiv so zu behandeln, als würde es eine Kopie erstellen, da es das sortierte Array zurückgibt.)
– jpaugh
10. Januar 2019 um 22:59 Uhr
Stimme @ninjagecko zu. dictionary wäre besser. Hier ist meine Antwort auf einen anderen Ansatz.
– Nguyễn Văn Phong
2. Februar 2021 um 2:09 Uhr
Radikand
Wenn Sie Unterstrich oder Lodash verwenden, ist dies am einfachsten:
Wie von anderen darauf hingewiesen, können Sie dann die ausführen _.keys() und _.values() Funktionen auf das Ergebnis, um nur die eindeutigen Zahlen bzw. deren Vorkommen zu erhalten. Aber meiner Erfahrung nach ist das ursprüngliche Objekt viel einfacher zu handhaben.
Es ist nur erwähnenswert, dass countBy nur Elemente enthält, die in der Liste vorhanden sind. Wenn Sie also Elemente zählen möchten, die möglicherweise nicht in der Liste vorhanden sind, müssen Sie die Ausnahme behandeln. Oder verwenden Sie den Lodash-Filter und die Länge wie folgt: filter([true, true, true, false], function(m){return m==true}).length. Dies würde nur 0 zurückgeben, wenn keine Werte vorhanden sind.
– Doug
3. Februar 2021 um 16:24 Uhr
Es lohnt sich hinzuzufügen, dass Sie Folgendes benötigen: const _ = require(“lodash”)
– Alex
20. Mai 2021 um 23:30 Uhr
Einzeilige ES6-Lösung. So viele Antworten, die ein Objekt als Karte verwenden, aber ich kann niemanden sehen, der ein tatsächliches verwendet Karte
Es ist nur erwähnenswert, dass countBy nur Elemente enthält, die in der Liste vorhanden sind. Wenn Sie also Elemente zählen möchten, die möglicherweise nicht in der Liste vorhanden sind, müssen Sie die Ausnahme behandeln. Oder verwenden Sie den Lodash-Filter und die Länge wie folgt: filter([true, true, true, false], function(m){return m==true}).length. Dies würde nur 0 zurückgeben, wenn keine Werte vorhanden sind.
– Doug
3. Februar 2021 um 16:24 Uhr
Es lohnt sich hinzuzufügen, dass Sie Folgendes benötigen: const _ = require(“lodash”)
– Alex
20. Mai 2021 um 23:30 Uhr
Verwenden Sie nicht zwei Arrays für das Ergebnis, verwenden Sie ein Objekt:
a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
result = { };
for(var i = 0; i < a.length; ++i) {
if(!result[a[i]])
result[a[i]] = 0;
++result[a[i]];
}
Dann result wird aussehen wie:
{
2: 5,
4: 1,
5: 3,
9: 1
}
9766900cookie-checkZählen des Vorkommens / der Häufigkeit von Array-Elementenyes
Wenn Sie nur sehen wollten, ob ein Wert nur einmal vorkommt (statt zwei- oder mehrmals), könnten Sie verwenden
if (arr.indexOf(value) == arr.lastIndexOf(value))
– Rodrigo
6. März 2016 um 12:58 Uhr
Wir können benutzen
ramda.js
um dies auf einfache Weise zu erreichen.const ary = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; R.countBy(r=> r)(ary)
– Eshwar Prasad Yaddanapudi
4. Januar 2017 um 5:50 Uhr
arr.filter(x => x===5).length
würden zurückkehren3
um anzuzeigen, dass es ‘3’ Fünfer im Array gibt.– noobninja
15. Juni 2020 um 21:21 Uhr
Nehmen wir an, meine Antwort ist ein Array von Objekten
– Ajay
12. Mai 2021 um 15:04 Uhr