2009-07-02 12 views
11

Estoy tratando de usar el objeto JavaScript como una matriz asociativa y todo estaba bien hasta que necesité obtener el número de entradas que están almacenadas en él. ¿Cuál es la forma más fácil y más elegante de hacer eso? Todo lo que puedo pensar es ejecutar la función for each loop o jQuery $.each y solo ver cuantas iteraciones haría pero parece una cosa horrible de hacer.¿Cómo obtengo el número de campos en el objeto JavaScript?

Respuesta

29

Old Firefox admite la propiedad __count__. Los entornos más nuevos admiten ES5 Object.keys. Para los entornos de mayor edad tenemos que vuelve a los simplemente iterar sobre el objeto y contando manualmente (uf!):

function count(obj) { 

    if (obj.__count__ !== undefined) { // Old FF 
     return obj.__count__; 
    } 

    if (Object.keys) { // ES5 
     return Object.keys(obj).length; 
    } 

    // Everything else: 

    var c = 0, p; 
    for (p in obj) { 
     if (obj.hasOwnProperty(p)) { 
      c += 1; 
     } 
    } 

    return c; 

} 
+4

Oh mi dios, O (n) para obtener el número de entradas en un mapa ... Bueno, esto apesta. :/ – fgysin

+1

(No estoy diciendo que su respuesta no sea correcta, por cierto. Solo me decepcionó JS ...) – fgysin

+0

¿Qué significa navegadores antiguos? Ver: http://kangax.github.io/compat-table/es5/#Object.keys – leo

2

Todo se reduce a eso, o al contar cuando agrega y elimina propiedades del objeto.

2

Desafortunadamente no hay realmente una buena manera de saber el número de propiedades en un objeto sin iterar sobre ellas. Lo siguiente es bastante simple:

function countProps(obj) { 
    var l = 0; 
    for (p in obj) l++; 
    return l; 
} 

var bob = { a: 1, b: 2}; 

alert(countProps(bob)); 
3

Creo que esto ha sido respondido aquí anteriormente, y/o googlear puede guiarlo en la dirección correcta. Sin embargo permítanme señalar que una de las mayores trampas si se utiliza un bucle en forma de:

for (var attr in obj) { .... 

es que el objeto podría estar atestado de propiedades que no siempre suman, y la solución estándar a esto como Recuerdo que es necesario utilizar adicionalmente la prueba para hasOwnProperty, vea https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty

22

Esto funcionó para mí:

Object.keys(obj).length 
+0

Específico de IE, parece (ver la respuesta de James) –

+0

Esto debe marcarse como la respuesta correcta. –

Cuestiones relacionadas