2010-12-03 24 views
5

Estoy ahorrando pares de valores clave en el contenedor div usando:Cómo conseguir tamaño del objeto jQuery

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

Al final tengo que comprobar si algo se almacena en este contenedor div.

Así que primero me sale el contenido llamando:

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

A continuación, para comprobar su tamaño con data.length o data.size.

Pero ambas funciones no existen. Como sé que la función de datos en jquery devuelve un objeto, entonces debería ser capaz de obtener el tamaño de este objeto.

¿Cómo obtengo el tamaño del objeto devuelto por la función de datos en jquery?

+0

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

+0

Si desea verificar si una clave específica está en data() use: if ('key_name' en $ ('# div_id'). data()) – fredrik

Respuesta

10

Los objetos no tienen un "tamaño". Se podía contar con sus propiedades, sin embargo:

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

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

    return count; 
} 

Uso:

alert(getPropertyCount(data)); 
+0

¿Debería ser eso? 'para (tecla var en obj) {'? –

+1

+1 para obj.hasOwnProperty (clave). – fredrik

+0

¿Por qué el voto a favor? – jwueller

0

objetos JavaScript no tiene una propiedad de longitud. Pero podrías calcularlo fácilmente con una simple función jQuery.

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

    return n; 
} 

Entonces utilizarlo con $ ('# div_id') dataLength()

EDITAR:.

mente las otras respuestas acerca de la estructura de datos en .data y la comprobación de .hasOwnProperty

2

No es la mejor idea almacenar esos pares clave/valor en este nivel en el objeto/nodo.

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

retornos todos los datos que se adjunta a este node, esto incluiría event handlers por ejemplo de los hay.

Así que la mejor solución es crear un objeto que contiene todos sus datos:

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

A su pregunta real. Los objetos JavaScript simples no poseen una propiedad .length. Usted tiene que comprobar que por sí mismo, de enlace de las llaves:

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

Esto debería mejorarse mediante la comprobación y también llamando al método .hasOwnProperty() el que se asegura de que la propiedad actual no está inheritated desde algún lugar de la cadena de prototipo.

1

¿Sabes qué "llaves" estabas usando? si es así, simplemente verifique las claves, de lo contrario, store an Object or Array instead.

p. Ej.

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

Entonces cuando lo necesite volver a salir, sólo tienes que tomar, que la clave ...

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

Tenga en cuenta, que los objetos de JavaScript/"mapas" no tienen una "longitud" o método/propiedad "tamaño", por lo que si es necesario comprobar si contiene algo, una función genérica como esta Deberia trabajar.

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