Zählen des Vorkommens / der Häufigkeit von Array-Elementen

Lesezeit: 5 Minuten

Zahlen des Vorkommens der Haufigkeit von Array Elementen
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

    – Ajay

    12. Mai 2021 um 15:04 Uhr

1646761514 404 Zahlen des Vorkommens der Haufigkeit von Array Elementen
Adams

const occurrences = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4].reduce(function (acc, curr) {
  return acc[curr] ? ++acc[curr] : acc[curr] = 1, acc
}, {});

console.log(occurrences) // => {2: 5, 4: 1, 5: 3, 9: 1}

  • 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

Zahlen des Vorkommens der Haufigkeit von Array Elementen
Radikand

Wenn Sie Unterstrich oder Lodash verwenden, ist dies am einfachsten:

_.countBy(array);

So dass:

_.countBy([5, 5, 5, 2, 2, 2, 2, 2, 9, 4])
=> Object {2: 5, 4: 1, 5: 3, 9: 1}

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

const map = arr.reduce((acc, e) => acc.set(e, (acc.get(e) || 0) + 1), new Map());

Verwenden map.keys() um einzigartige Elemente zu erhalten

Verwenden map.values() um die Vorkommnisse zu erhalten

Verwenden map.entries() um die Paare zu bekommen [element, frequency]

var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]

const map = arr.reduce((acc, e) => acc.set(e, (acc.get(e) || 0) + 1), new Map());

console.info([...map.keys()])
console.info([...map.values()])
console.info([...map.entries()])

  • 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
}

976690cookie-checkZählen des Vorkommens / der Häufigkeit von Array-Elementen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy