2010-12-03 2 views
5

Ich rette Schlüssel-Wert-Paare in div Behälter unter Verwendung:Wie kommt man Größe von jQuery-Objekt

$('#div_id').data(key, value); 

Am Ende muss ich überprüfen, ob alles in diesem div Container gespeichert ist.

Also zuerst habe ich den Inhalt durch den Aufruf:

var data = $('#div_id').data(); 

Dann seine Größe mit data.length oder data.size zu überprüfen.

Aber beide Funktionen existieren nicht. Da ich weiß, dass die Datenfunktion in jquery ein Objekt zurückgibt, sollte ich in der Lage sein, die Größe dieses Objekts zu ermitteln.

Wie bekomme ich die Größe des Objekts von der Datenfunktion in jquery zurückgegeben?

+0

Dupe? http://stackoverflow.com/questions/2402193 – kafuchau

+0

Wenn Sie überprüfen möchten, ob ein bestimmter Schlüssel in data() ist, verwenden Sie: if ('Schlüsselname' in $ ('# div_id'). data()) – fredrik

Antwort

10

Objekte haben keine "Größe". Sie könnten ihre Eigenschaften zählen, aber:

function getPropertyCount(obj) { 
    var count = 0, 
     key; 

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

    return count; 
} 

Verbrauch:

alert(getPropertyCount(data)); 
+0

Sollte das sein 'für (var Schlüssel in obj) {'? –

+1

+1 für obj.hasOwnProperty (Schlüssel). – fredrik

+0

Warum der Downvote? – jwueller

0

Javascript Objekte nicht über eine Länge Eigenschaft. Aber Sie könnten es leicht mit einer einfachen jQuery-Funktion berechnen.

$.fn.dataLength = function() { 
    var i, 
     n = 0, 
     t = $(this); 
    for (i in t.data()) { 
     n += 1; 
    } 

    return n; 
} 

verwenden Sie es dann mit $ ('# div_id') dataLength()

EDIT.

Geist der anderen Antworten über die Datenstruktur in .data und die Prüfung auf .hasOwnProperty

2

Es ist nicht die beste Idee, diese Schlüssel/Wert-Paare auf dieser Ebene auf dem Objekt/Knoten zu speichern.

var data = $('#div_id').data(); 

kehrt alle Daten, die auf diese node angebracht ist, würde dies event handlers zum Beispiel gehören der es welche gibt.

So ist die beste Lösung ist, um ein Objekt zu erstellen, die alle Ihre Daten enthält:

$('#div_id').data('mydata', {}); 
/* ... */ 
$('#div_id').data('mydata')[key] = value; 

Um Ihre eigentliche Frage. Einfache JavaScript-Objekte besitzen keine .length-Eigenschaft. Sie müssen das selbst überprüfen, über die Tasten Looping:

var mylen = 0; 
for(var prop in $('#div_id').data('mydata')) { 
    mylen++; 
} 

Dies sollte auch überprüft und den Aufruf der .hasOwnProperty() Methode verbessert werden, die sicherstellt, dass die aktuelle Eigenschaft nicht von irgendwo in der Prototypkette inheritated wird.

1

Wissen Sie, welche "Schlüssel" Sie verwendet haben? Wenn ja, überprüfen Sie einfach die Schlüssel, wenn nicht, store an Object or Array instead.

z.B.

var myStuff = {}; 
myStuff.date = new Date(); 
myStuff.name = "Santa Claus"; 
myStuff.lifeStory = "Once upon a time..."; 
$('#div_id').data('myData', myStuff); 

Dann, wenn Sie es wieder benötigen, greifen Sie einfach den einen Schlüssel ...

var data = $('#div_id').data('myData'); 

Denken Sie daran, dass JavaScript-Objekte/„Maps“ nicht über eine „Länge“ oder „Größe“ Methode/Eigenschaft, also wenn Sie müssen überprüfen, ob es etwas, eine generische Funktion wie diese enthält sollte arbeiten.

function isObjEmpty(obj){ 
    for(var i in obj){ 
    return false; 
    } 
    return true; 
}