2009-08-28 12 views
138

Supongamos que tengo el siguiente objeto en JavaScript:¿Cómo cuento los atributos de un objeto de JavaScript?

var object = { 
    "key1": "value1", 
    "key2": "value2", 
    "key3": "value3" 
}; 

¿Cómo puedo saber cuántos valores existe en el objeto?

+7

Espera! JS no tiene tuplas ni diccionarios. Eso se llama un objeto (escrito en notación literal), aunque parece un diccionario de Python. Sin embargo, ¿cómo se llama una tupla en el ejemplo anterior? –

+0

¿Cómo sugieres cambiar el nombre de esta pregunta? –

+0

¿Tal vez "atributos" en lugar de "tuplas"? Eso es suponiendo que quieras que la respuesta sea 3 con el 'objeto' anterior. –

Respuesta

97

No hay una respuesta fácil, porque Object — que todos los objetos en JavaScript derivan de — incluye muchos atributos automáticamente, y el conjunto exacto de atributos que obtiene depende del intérprete en particular y de qué código se ejecutó antes que el suyo. Por lo tanto, de alguna manera tiene que separar los que definió de los que obtuvo "gratis".

Aquí hay una manera:

var foo = {"key1": "value1", "key2": "value2", "key3": "value3"}; 
Object.prototype.foobie = 'bletch'; // add property to foo that won't be counted 

var count = 0; 
for (var k in foo) { 
    if (foo.hasOwnProperty(k)) { 
     ++count; 
    } 
} 
alert("Found " + count + " properties specific to foo"); 

La segunda línea muestra cómo otro código puede añadir propiedades a todos los Object derivados. Si elimina la verificación hasOwnProperty() dentro del ciclo, el recuento de propiedad subirá al menos a 4. En una página con otro JavaScript además de este código, podría ser mayor que 4, si ese otro código también modifica el prototipo Object.

+2

No debe usar un objeto vacío para acceder a Object.prototype. Solo use Object.prototype.hasOwnProperty.call (foo, k). –

+0

¿por qué no haces foo.hasOwnProperty (k). ¿Me estoy perdiendo de algo? Quiero decir que incluso el tipo de JavaScript se deriva de Object.prototype, y tendrá un método hasOwnProperty(). – bucabay

+0

@Elijah: No veo lo que está mal con la forma en que lo hice, pero sí, tu camino también debería funcionar. –

11

Puede iterar sobre el objeto de obtener las claves o valores:

function numKeys(obj) 
{ 
    var count = 0; 
    for(var prop in obj) 
    { 
     count++; 
    } 
    return count; 
}

Se parece a un "error de ortografía", pero sólo quiero señalar que el ejemplo es una sintaxis no válida, debe ser

var object = {"key1":"value1","key2":"value2","key3":"value3"}; 

5

Esta función hace uso de la propiedad __count__ de Mozilla si está disponible ya que es más rápido que iterar sobre cada propiedad.

function countProperties(obj) { 
    var count = "__count__", 
    hasOwnProp = Object.prototype.hasOwnProperty; 

    if (typeof obj[count] === "number" && !hasOwnProp.call(obj, count)) { 
    return obj[count]; 
    } 
    count = 0; 
    for (var prop in obj) { 
    if (hasOwnProp.call(obj, prop)) { 
     count++; 
    } 
    } 
    return count; 
}; 

countProperties({ 
    "1": 2, 
    "3": 4, 
    "5": 6 
}) === 3; 
+0

Tenga en cuenta que este atributo se desactivó en Firefox 4 y se eliminó poco después, por lo que no ha estado presente en ningún navegador durante varios años. –

3

EDIT: esto mayúsculas y errores con jQuery a suceder, además de algunos otros inconvenientes. NO DEBE UTILIZARLO: (quizás, si se pudiera agregar un método privado en lugar de una función de propiedad pública, esto estaría bien, pero no tiene tiempo ahora). Comunidad WikiEd

no utilice:

Aunque objeto de JavaScript por defecto no tiene la función de recuento, las clases son fácilmente ampliable, y se puede añadir uno mismo:

Object.prototype.count = function() { 
    var count = 0; 
    for(var prop in this) { 
     if(this.hasOwnProperty(prop)) 
      count = count + 1; 
    } 
    return count; 
} 

Así que después de que uno puede ejecutar

var object = {'key1': 'val1', 'key2':'val2', 'key3':'val3'}; 
console.log(object.count()); // 3 

Como conclusión, si desea contar con la funcionalidad de los objetos, es necesario copiar el código de bloque de código 1, y pegarlo a principios i n tiempo de ejecución (antes de llamar al conteo).

¡Avísame si a ti te funciona!

Saludos, Pedro

+0

Hola. He estado usando esto por un tiempo sin problemas ... el único problema que encontré es que si enlazas los objetos después de imponer esta propiedad en todos los objetos, se realizará un bucle adicional. Si alguien puede encontrar un workarround, sería genial – droope

+0

GRANDES PROBELMOS CON ESTE UNO – droope

+0

¿Por qué es esto un wiki? – Shaz

-3

Aunque no sería un "objeto real", siempre se puede hacer algo como esto:

var foo = [ 
    {Key1: "key1"}, 
    {Key2: "key2"}, 
    {Key3: "key3"} 
]; 

alert(foo.length); // === 3 
+0

Estamos intentando obtener la longitud de la propiedad. Entonces el resultado debería ser solo 1 en tu caso. – Santosh

1

Para aquellos que leerá esta pregunta/respuesta, aquí es una implementación de JavaScript de la colección de diccionarios muy similar a la funcionalidad como.NETO: JavaScript Dictionary

44

Utilice la biblioteca underscore, muy útil: _.keys(obj).length.

+3

Parece una biblioteca muy útil. –

+0

Lo estoy usando, muy bueno. Gracias Alexander. – Wolf87

+6

Con underscore.js, puede usar _.size (obj). – GijsjanB

12
var miobj = [ 
    {"padreid":"0", "sw":"0", "dtip":"UNO", "datos":[]}, 
    {"padreid":"1", "sw":"0", "dtip":"DOS", "datos":[]} 
]; 
alert(miobj.length) //=== 2 

pero

alert(miobj[0].length) //=== undefined 

esta función es muy buena

Object.prototype.count = function() { 
    var count = 0; 
    for(var prop in this) { 
     if(this.hasOwnProperty(prop)) 
      count = count + 1; 
    } 
    return count; 
} 

alert(miobj.count()) // === 2 
alert(miobj[0].count()) // === 4 
+0

¡Bienvenido!Considere nombrar las variables y los datos en inglés ;-) – atxe

+3

La extensión de objetos nativos es una mala práctica. No lo hagas – nkm

+0

cuando uso este código, entonces el menú desplegable de arranque no funciona –

421

puede hacerlo a través de este simple código:

Object.keys(myObject).length 
+2

Esto está lejos de ser totalmente compatible: http://kangax.github.io/es5-compat-table/ – Andrew

+16

@Andrew No diría "muy lejos de todo" I diría que no es compatible con IE8 y abajo. Además, [Polyfill] (http://jsperf.com/polyfill-object-keys). – hitautodestruct

+0

Bastante justo, no es compatible con IE8 o inferior. Si eso es un problema, compruebe la existencia de claves() en Object (o try-catch) y retroceda. – Andrew

Cuestiones relacionadas