2010-07-01 5 views
9

Ich habe ein Javascript-Objekt, das ich als "hashmap" verwenden möchte. Die Schlüssel sind immer Zeichenfolgen, also glaube ich nicht, dass ich etwas so ausgeklügeltes brauche wie das, was in this SO question beschrieben ist. (Ich erwarte auch nicht, dass die Anzahl der Schlüssel über etwa 10 steigt, also bin ich nicht besonders besorgt, dass Lookups O (n) vs. O (log n) usw. sind)Ermitteln, wie viele Felder ein Javascript-Objekt hat

Die einzige Funktionalität, die ich will integrierte Javascript-Objekte scheinen nicht zu haben, ist eine schnelle Möglichkeit, die Anzahl der Schlüssel/Wert-Paare im Objekt, wie Java Map.size zurückgibt. Natürlich könntest du einfach so etwas tun wie:

function getObjectSize(myObject) { 
    var count=0 
    for (var key in myObject) 
    count++ 
    return count 
} 

aber das scheint irgendwie hacky und Kreisel. Gibt es einen "richtigen Weg", um die Anzahl der Felder im Objekt zu erhalten?

+0

Der einzige Vorschlag, auf Ihre Methode wäre, einen zusätzlichen Parameter hinzufügen auszuschließen/include vererbten Eigenschaften, in diesem Fall würden Sie hasOwnProperty statt nur der einfachen for-Schleife –

Antwort

3

Eine Korrektur: Sie müssen in jeder Iteration myObject.hasOwnProperty(key) überprüfen, da dort Attribute vererbt werden können. Zum Beispiel, wenn Sie dies vor der Schleife Object.prototype.test = 'test' tun, wird auch test gezählt werden.

Und über Ihre Frage sprechen: Sie können nur eine Hilfsfunktion definieren, wenn Geschwindigkeit keine Rolle spielt. Schließlich definieren wir Helfer für die Trimmfunktion und andere einfache Dinge. Viele Javascript ist "Art von Hacky und Kreisverkehr" :)

Update
Failure Beispiel wie gewünscht.

Object.prototype.test = 'test'; 
var x = {}; 
x['a'] = 1; 
x['b'] = 2; 

Der zurück Zählung 3.

+0

Das Objekt wird mit 'myObject = {}' erstellt und dann werden Eigenschaften mit hinzugefügt 'myObject [Schlüssel] = Wert' wobei' Schlüssel' immer eine Zeichenkette ist. Ich denke, das wäre in diesem Fall kein Problem. – MatrixFrog

+0

@MatrixFrog Oh, wirklich? :) Es spielt keine Rolle, welcher Typ 'Schlüssel' ist. Ich habe ein Beispiel hinzugefügt, um den Punkt zu verdeutlichen. –

+0

BTU, Anurag drückt den gleichen Punkt in seiner Antwort (der Kommentar dort) –

0

Sie könnte auch einfach einmal myObject.length (in Arrays)

das macht nichts, siehe: JavaScript object size

+1

Er fragt nicht nach Arrays oder nach einem 'sizeof'. Er möchte die Anzahl der Zuordnungen (Schlüssel/Wert-Paare) in einem Objekt. –

+0

'myObject.Länge "war mein erster Gedanke, aber ja, es funktioniert nur für Arrays. – MatrixFrog

+0

BTW, die Verbindung, die Sie geben, ist für SIZEOF, z. Anzahl der verwendeten Bytes. OP möchte die Anzahl der Schlüssel/Wert-Paare in einem Objekt wissen. (Ich habe fast -1, weil dies keine Antwort auf die Frage ist; aber der Link ist interessant, auch wenn zu einem anderen Thema.) – ToolmakerSteve

0

Das ist alles was Sie tun können. Klarerweise sind JavaScript-Objekte dafür nicht ausgelegt. Und das wird Ihnen nur die Anzahl der Enumerable-Eigenschaften geben. Versuchen Sie getObjectSize(Math).

13

Es ist ein einfacher Weg, geskilled in ECMAScript 5.

Object.keys(..) gibt ein Array aller Schlüssel für das Objekt definiert sein. Länge kann dazu aufgerufen werden. Versuchen Sie in Chrome:

Object.keys({a: 1, b: 2}).length; // 2 

Beachten Sie, dass alle Objekte im Grunde Schlüssel/Wert-Paare in JavaScript sind, und sie sind auch sehr dehnbar. Sie können die Object.prototype mit einer size Methode erweitern und die Anzahl dort erhalten. Eine viel bessere Lösung besteht jedoch darin, eine Schnittstelle vom Typ HashMap zu erstellen oder eine der vielen vorhandenen Implementierungen zu verwenden und size darauf zu definieren. Hier ist eine kleine Einführung:

function HashMap() {} 

HashMap.prototype.put = function(key, value) { 
    this[key] = value; 
}; 

HashMap.prototype.get = function(key) { 
    if(typeof this[key] == 'undefined') { 
     throw new ReferenceError("key is undefined"); 
    } 
    return this[key]; 
}; 

HashMap.prototype.size = function() { 
    var count = 0; 

    for(var prop in this) { 
     // hasOwnProperty check is important because 
     // we don't want to count properties on the prototype chain 
     // such as "get", "put", "size", or others. 
     if(this.hasOwnProperty(prop) { 
      count++; 
     } 
    } 

    return count; 
}; 

Verwendung als (example):

var map = new HashMap(); 
map.put(someKey, someValue); 
map.size(); 
+0

Schlüssel gibt nur die Enumerable, hasOwnProperty Schlüssel zurück. –

+0

"TypeError: Object.keys ist keine Funktion". Ich denke, ich hätte erwähnen sollen, dass ich an einer Firefox-Erweiterung arbeite. Wenn es in Firefox nicht funktioniert, ist es für mich ziemlich nutzlos. Trotzdem, gute Informationen für die Zukunft. Vielen Dank! – MatrixFrog

+0

@Matthew - ja, deshalb habe ich gesagt * am Objekt definiert * und ja, die Aufzählbarkeit ist auch wichtig, aber das ist es, was 'for..in' ebenfalls zurückkommt, also habe ich es aus der Diskussion gestrichen. @MatrixFrog - Es sollte in Firefox 4 kommen, und Sie können immer einen benutzerdefinierten Objekttyp mit einer Größenmethode definieren, wie im obigen Beispiel. – Anurag

Verwandte Themen