Javascript zählt die Anzahl der Objekte im Objekt [duplicate]

Lesezeit: 4 Minuten

Ich habe ein Objekt wie:

Object {0=Object, 1=Object, 2=Object} // Output from console.log(obj.Data);

Aber es gibt keine Möglichkeit, die Anzahl der Objekte im Objekt zu zählen und dann schließlich den Attributwert von den Unterobjekten zu erhalten.

Ich habe versucht

console.log(obj.Data[0].length); // It does not work

console.log(obj.Data.length); // It does not work

Das ist ein bisschen knifflig für mich. Hoffe ihr könnt helfen.

  • könntest du bitte das komplette Objekt posten?

    – Zain Shaikh

    7. Juni 2013 um 5:36 Uhr

  • Warum verwenden Sie ein Objekt auf diese Weise? Bei Ihrer Frage gibt es eine Menge Dinge zu beachten – Sie müssen verstehen, was Eigenschaften sind, welche aufzählbar sind, wie Prototypen hier zum Chaos beitragen können und so weiter. Warum nicht einfach ein Array verwenden?

    – Sacho

    7. Juni 2013 um 5:39 Uhr

  • Obwohl dieses q als Duplikat markiert ist, funktioniert die hier akzeptierte Antwort für mich einfacher als die in der ersten gestellten Frage angegebenen Lösungen.

    – Anshu Prateek

    18. Februar 2016 um 9:53 Uhr

Benutzer-Avatar
Michael Geary

Der einfachste Weg, dies mit hervorragender Leistung und Kompatibilität mit alten und neuen Browsern zu tun, besteht darin, einen von beiden einzuschließen Lo-Dash oder Unterstreichen auf deiner Seite.

Dann kannst du beides verwenden _.size(object) oder _.keys(object).length

Für dein obj.Datakönntest du das testen mit:

console.log( _.size(obj.Data) );

oder:

console.log( _.keys(obj.Data).length );

Lo-Dash und Underscore sind beide ausgezeichnete Bibliotheken; Sie würden beide in Ihrem Code sehr nützlich finden. (Sie sind einander ziemlich ähnlich; Lo-Dash ist eine neuere Version mit einigen Vorteilen.)

Alternativ könnten Sie diese Funktion in Ihren Code aufnehmen, der einfach die Eigenschaften des Objekts durchläuft und sie zählt:

function ObjectLength( object ) {
    var length = 0;
    for( var key in object ) {
        if( object.hasOwnProperty(key) ) {
            ++length;
        }
    }
    return length;
};

Sie können dies testen mit:

console.log( ObjectLength(obj.Data) );

Dieser Code ist jedoch nicht so schnell, wie er in modernen Browsern sein könnte. Für eine Version, die in modernen Browsern viel schneller ist und in alten noch funktioniert, können Sie Folgendes verwenden:

function ObjectLength_Modern( object ) {
    return Object.keys(object).length;
}

function ObjectLength_Legacy( object ) {
    var length = 0;
    for( var key in object ) {
        if( object.hasOwnProperty(key) ) {
            ++length;
        }
    }
    return length;
}

var ObjectLength =
    Object.keys ? ObjectLength_Modern : ObjectLength_Legacy;

und wie zuvor, testen Sie es mit:

console.log( ObjectLength(obj.Data) );

Dieser Code verwendet Object.keys(object).length in modernen Browsern und greift bei alten Browsern auf das Zählen in einer Schleife zurück.

Aber wenn Sie all diese Arbeit machen, würde ich empfehlen, stattdessen Lo-Dash oder Underscore zu verwenden und alle Vorteile zu nutzen, die diese Bibliotheken bieten.

Ich habe eine eingerichtet jsPerf, das die Geschwindigkeit dieser verschiedenen Ansätze vergleicht. Bitte führen Sie es in allen Browsern aus, die Sie zu den Tests hinzufügen können.

Danke an Barmar für den Vorschlag Object.keys für neuere Browser in seiner Antwort.

  • Die Verwendung des Bedingungsoperators für diese Art der Merkmalserkennung erscheint übermäßig kompliziert.

    – Paul Philips

    7. Juni 2013 um 5:50 Uhr

  • Es ist ein ziemlich üblicher Weg, es zu tun, aber fairerweise könnten Sie dasselbe mit einer if-Anweisung tun. Die Hauptsache ist, es außerhalb der Funktion statt innerhalb der Funktion zu tun.

    – Michael Geary

    7. Juni 2013 um 5:52 Uhr

  • Ich habe Object.keys(obj.Data) ausprobiert und es gibt 0,1,2 zurück. Wie kann ich die Gesamtzahl abrufen oder wird es in diesem Format zurückgegeben?

    – Bryan Lernen

    7. Juni 2013 um 6:04 Uhr

  • Bryan, ruf an ObjectLength(obj.Data)

    – Michael Geary

    7. Juni 2013 um 6:07 Uhr

  • Sie können auch tun values(object).length

    – Panayiotis Georgiou

    13. Oktober 2020 um 7:20 Uhr

Benutzer-Avatar
Barmar

In neueren Browsern können Sie Folgendes verwenden:

Object.keys(obj.Data).length

Sehen MDN

Verwenden Sie für ältere Browser die for-in Schleife in Michael Gearys Antwort.

  • Hallo Barmar, irgendwie loggt es sich nicht unter Konsole ein… Kannst du mir helfen indem du es erklärst?

    – Bryan Lernen

    7. Juni 2013 um 5:53 Uhr

  • keys ist keine Eigenschaft des zu zählenden Objekts. @BryanLearn: Er meinte Object.keys(obj.Data).length. Sollte sowieso als Dupe geschlossen werden 🙂

    – Bergi

    7. Juni 2013 um 5:54 Uhr


  • Für mich ist das die Antwort. Das Hinzufügen einer Bibliothek wie Lodash ist nicht Teil einer Lösung. Auch auf a kann man sich nicht verlassen for in Schleife zur Ausgabe in einer erwarteten Reihenfolge.

    – Ben Racicot

    13. Januar 2016 um 17:35 Uhr

  • Viel bessere Antwort.

    – Manachi

    18. Februar 2018 um 2:06 Uhr

  • @BenRacicot Wenn dir nur die Länge wichtig ist, warum spielt dann die Reihenfolge eine Rolle?

    – Barmar

    18. Februar 2018 um 18:34 Uhr

Versuchen Demo hier

var list ={}; var count= Object.keys(list).length;

  • Sie sollten lieber andere Antworten positiv bewerten, anstatt die Lösungen erneut zu veröffentlichen 🙂

    – Bergi

    7. Juni 2013 um 6:21 Uhr


  • Als ich anfing Demo zu machen, hatte niemand diese Antwort gegeben.

    – Sudarschan

    7. Juni 2013 um 6:27 Uhr

  • @Bergi. Sie sollten sich den Zeitstempel vor Kommentaren ansehen. Manchmal gibt es eine bessere Antwort, aber niemand kümmert sich darum.

    – ibnɘꟻ

    20. März 2020 um 11:44 Uhr

  • @FendiSetiawan Wenn man sich die Zeitstempel ansieht, sind das 7 Jahre alte Kommentare zu einer geschlossenen Frage? (Und selbst dann wurde Barmars Antwort viel früher gepostet und bearbeitet.)

    – Bergi

    20. März 2020 um 11:56 Uhr

1206380cookie-checkJavascript zählt die Anzahl der Objekte im Objekt [duplicate]

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

Privacy policy