Anzahl der Elemente in einem Javascript-Objekt

Lesezeit: 6 Minuten

Benutzer-Avatar
GetFree

Gibt es eine Möglichkeit, (von irgendwoher) die Anzahl der Elemente in einem Javascript-Objekt zu erhalten? (dh konstante Zeitkomplexität).

Ich kann keine Eigenschaft oder Methode finden, die diese Informationen abruft. Bisher kann ich nur daran denken, eine Iteration durch die gesamte Sammlung zu machen, aber das ist lineare Zeit.
Es ist seltsam, dass es keinen direkten Zugriff auf die Größe des Objekts gibt, finden Sie nicht?

BEARBEITEN:

Ich spreche von der Object Objekt (nicht Objekte im Allgemeinen):

var obj = new Object ;

  • Bereits hier beantwortet stackoverflow.com/questions/126100/… Object.keys(obj).length

    – Gamaschen

    14. Juni 2012 um 3:10 Uhr

Benutzer-Avatar
Christoph

Obwohl JS-Implementierungen einen solchen Wert möglicherweise intern verfolgen, gibt es keinen Standardweg, um ihn zu erhalten.

In der Vergangenheit hat die Javascript-Variante von Mozilla die nicht standardmäßig __count__wurde aber mit Version 1.8.5 entfernt.

Für Cross-Browser-Scripting müssen Sie die Eigenschaften explizit durchlaufen und überprüfen hasOwnProperty():

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

Bei ECMAScript 5-fähigen Implementierungen kann dies auch geschrieben werden als (Kudos to Avi Flax)

function countProperties(obj) {
    return Object.keys(obj).length;
}

Denken Sie daran, dass Sie auch Eigenschaften vermissen werden, die nicht aufzählbar sind (z. B. die eines Arrays length).

Wenn Sie ein Framework wie jQuery, Prototype, Mootools, $whatever-the-newest-hype verwenden, überprüfen Sie, ob sie mit einer eigenen Sammlungs-API ausgestattet sind, die möglicherweise eine bessere Lösung für Ihr Problem darstellt als die Verwendung nativer JS-Objekte.

  • Verdammt, ich vergesse immer hasOwnProperty. Zu viel Zeit im .NET-Land sage ich Ihnen. +1

    – Annakata

    5. Juni 2009 um 16:36 Uhr

  • jQuery verwendet ein Objekt für seine Sammlungen, das es aus Abfragen erhält, und stellt diesen Wert mit einer Längeneigenschaft bereit.

    – Nosredna

    5. Juni 2009 um 17:10 Uhr

  • Firefox4 __count__ ist weg 🙁

    – Timo Huovinen

    11. April 2011 um 18:37 Uhr


  • Gibt es eine Möglichkeit, dies ohne ein for in zu tun? Ich bin in der gleichen Art von Bindung, aber ich möchte, dass es JSLint passiert, wenn dies möglich ist.

    – Strassenlicht

    30. Januar 2013 um 15:20 Uhr

  • warum brauchen wir hasOwnProperty() ?

    – schweizerisch

    20. Februar 2020 um 8:34 Uhr

Benutzer-Avatar
ZelkiN

Dazu in jeder ES5-kompatiblen Umgebung

Object.keys(obj).length

(Browserunterstützung von hier)
(Doc auf Object.keys hierenthält eine Methode, die Sie Nicht-ECMA5-Browsern hinzufügen können)

  • Dies ist nicht die richtige Frage, um diese Antwort darauf zu stellen. Damit nehmen Sie alle Schlüssel des Objekts, fügen sie in ein neu erstelltes Array ein und rufen dann die Längeneigenschaft aus diesem neuen Array ab.

    – GetFree

    29. März 2013 um 21:41 Uhr

  • Es ist vielleicht nicht das programmtechnisch effizienteste, aber es ist das entwicklereffizienteste.

    – Überlicht

    27. März 2016 um 1:26 Uhr

  • Ich stimme zu, es ist definitiv der schnellste (kurz, schnell erledigt) Weg, dies zu tun. Funktioniert auch gut mit verschachtelten Objekten, wenn Sie nur an den eigenen Schlüsseln des Unterobjekts interessiert sind, Object.keys(obj.nested_obj).length.

    – andiEiche

    1. Oktober 2020 um 21:35 Uhr


wenn Sie verwenden bereits jQuery in Ihrem Build, tun Sie dies einfach:

$(yourObject).length

Es funktioniert gut für mich bei Objekten, und ich hatte bereits jQuery als Abhängigkeit.

  • Seltsam… das funktioniert bei mir nicht. Ich bekomme immer 1. Die Antwort von ZelkiN funktioniert für mich.

    – Mike Nagetier

    13. Juni 2017 um 6:14 Uhr

  • Dieser Code gibt immer 1 zurück. Nur 1 Objekt. Es zählt keine Elemente darin

    – BeRocket

    28. Mai 2018 um 13:39 Uhr

  • Hat einer der oberen Wähler den Code überprüft? Es funktioniert nicht und gibt immer 1 zurück – egal was yourObject enthält.

    – Peter VARGA

    14. November 2021 um 17:49 Uhr


function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

AFAIK, es gibt keine Möglichkeit, dies zuverlässig zu tun, es sei denn, Sie wechseln zu einem Array. Was ehrlich gesagt nicht seltsam erscheinen – es scheint mir ziemlich einfach zu sein, dass Arrays zählbar sind und Objekte nicht.

Wahrscheinlich kommt man so etwas am nächsten

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

Aber das schafft Probleme oder zumindest Fragen. Alle vom Benutzer erstellten Eigenschaften werden gezählt, einschließlich der _length-Funktion selbst! Und während Sie es in diesem einfachen Beispiel vermeiden könnten, indem Sie einfach eine normale Funktion verwenden, heißt das nicht, dass Sie andere Skripte daran hindern können, dies zu tun. also, was machst du? Funktionseigenschaften ignorieren?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

Am Ende denke ich, dass Sie wahrscheinlich die Idee, Ihre Objekte zählbar zu machen, aufgeben und einen anderen Weg finden sollten, das zu tun, was Sie gerade tun.

  • GEFAHR WIRD ROBINSON! Tun NICHT Proto gegen Objekt! Alles stammt von Object ab, Sie werden die Client-Verarbeitung so lahmlegen, wenn Sie eine beträchtliche Menge an JS-Arbeit erledigen.

    – Annakata

    5. Juni 2009 um 16:29 Uhr

  • Äh … hast du nicht den Teil gelesen, wo ich in einem Kommentar geschrieben habe “Monkey Patching absichtlich, um ein Zeichen zu setzen” – komm schon, ich habe das absichtlich gemacht, damit die Leute nicht ein bisschen darüber nachdenken. Außerdem, obwohl ich Affen-Patching nicht befürworte, missverstehen Sie, wie die Prototyp-Kette in Javascript funktioniert, wenn Sie glauben, dass dies zu Leistungsproblemen führen würde video.yahoo.com/watch/111585/1027823

    – Peter Bailey

    5. Juni 2009 um 19:00 Uhr

  • Also… das ist ein Do or a Don’t?

    – Oscar Ryz

    2. März 2012 um 0:04 Uhr

  • In “Javascript: The Good Parts” prototypisiert er ein Objekt mit einer “create()”-Methode. Ich glaube, das ist das definitive Buch über Javascript.

    – Chris Dutrow

    13. März 2012 um 1:18 Uhr

Das Konzept von Anzahl/Länge/Dimensionalität ist für ein Objekt nicht wirklich sinnvoll, und wenn Sie es benötigen, legen Sie nahe, dass Sie wirklich ein Array für mich wollen.

Bearbeiten: Wies mich darauf hin, dass Sie dafür ein O (1) wollen. Meines Wissens gibt es keinen solchen Weg, fürchte ich.

  • GEFAHR WIRD ROBINSON! Tun NICHT Proto gegen Objekt! Alles stammt von Object ab, Sie werden die Client-Verarbeitung so lahmlegen, wenn Sie eine beträchtliche Menge an JS-Arbeit erledigen.

    – Annakata

    5. Juni 2009 um 16:29 Uhr

  • Äh … hast du nicht den Teil gelesen, wo ich in einem Kommentar geschrieben habe “Monkey Patching absichtlich, um ein Zeichen zu setzen” – komm schon, ich habe das absichtlich gemacht, damit die Leute nicht ein bisschen darüber nachdenken. Außerdem, obwohl ich Affen-Patching nicht befürworte, missverstehen Sie, wie die Prototyp-Kette in Javascript funktioniert, wenn Sie glauben, dass dies zu Leistungsproblemen führen würde video.yahoo.com/watch/111585/1027823

    – Peter Bailey

    5. Juni 2009 um 19:00 Uhr

  • Also… das ist ein Do or a Don’t?

    – Oscar Ryz

    2. März 2012 um 0:04 Uhr

  • In “Javascript: The Good Parts” prototypisiert er ein Objekt mit einer “create()”-Methode. Ich glaube, das ist das definitive Buch über Javascript.

    – Chris Dutrow

    13. März 2012 um 1:18 Uhr

1256710cookie-checkAnzahl der Elemente in einem Javascript-Objekt

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

Privacy policy