2011-01-14 22 views
33

Estoy trabajando en este animation function pero tengo un problema. Parece que no puedo realizar lo que debería ser una tarea fácil, no puedo obtener la longitud de un objeto. Si echas un vistazo a jsFiddle, puedes ver que estoy ejecutando alert(properties.length); y está devolviendo undefined. ¿Alguien puede ver por qué esto podría ser?JavaScript literal longitud del objeto === undefined?

+2

posible duplicado de [Longitud de Javascript asociativa Array] (http://stackoverflow.com/questions/5223/length-of-javascript-associative-array) – ripper234

Respuesta

38

objeto JavaScript simplemente hacer no tienen una propiedad length, solamente Arrays lo hacen. Si desea saber la cantidad de propiedades definidas en un objeto, debe iterar sobre ellas y contarlas.

Además, el bucle for in es propenso a errores debido extensión del Object.prototype ya que en atravesará la completa cadena de prototipo y enumerar todas las las propiedades que están en la cadena.

Ejemplo

// Poisoning Object.prototype 
Object.prototype.bar = 1; 

var foo = {moo: 2}; 
for(var i in foo) { 
    console.log(i); // logs both 'moo' AND 'bar' 
} 

Tienes que utilizar el método hasOwnProperty en el objeto con el fin de filtrar estas propiedades no deseadas.

// still the foo from above 
for(var i in foo) { 
    if (foo.hasOwnProperty(i)) { 
     console.log(i); // only logs 'moo' 
    } 
} 

Muchos frameworks de JavaScript por ahí extienden el prototipo, no usar hasOwnProperty a menudo conduce a errores horribles.

actualización

Con respecto al problema real que su código no es la animación ambas propiedades.

for(var p in properties) { 
    ... 
    for(var i = 0; i <= frames; i++) 
    { 
     setTimeout((function(exti, element) { 
      return function() { 

       // p gets overriden by for outer for in loop 
       element.style[p] = original + (pixels * exti) + 'px'; 
      } 

     // you need to pass in a copy of the value of p here 
     // just like you do with i and element 
     })(i, element), i * (1000/60), element); 
    } 
    .... 
} 
+0

En el mismo recuento, muchas bibliotecas (como jQuery) se desmoronarán horriblemente si extiendes object.prototype, por lo que si usas una de ellas hasOwnProperty es solo una pérdida de ciclos de CPU. –

+0

@Martin Jespersen ¿Entonces usted vende el código con "ADVERTENCIA SÓLO UTILICE CON LOS MARCOS A, B Y C" impresos en ellos? Lo sentimos, pero usar 'hasOwnProperty' * es ** una buena práctica. –

+0

pues no estoy cansado de una trama llena de código javascript que está tan lejos de ser optimizado que incluso cromo ahoga en él, de nuevo, creo que debería estar agradecido ya hago mi dinero limpiando el desorden que otros hacen: P –

0

Los objetos no tienen longitud, necesitará usar una matriz si así lo desea.

Si usted tiene que encontrar el número de propiedades en un objeto hay una sola manera:

var length =0; 
for(var i in obj) length++; 
+9

Utilice hasOwnProperty, por favor. –

+1

¿Por qué, cómo? ¿Dónde se aplica hasOwnProperty a esto? – Olical

+0

Mejor solo * no * actualizar Object.prototype? ¿Quién hace eso? ¡Este es realmente un gran ejemplo! –

11

Si está utilizando Underscore.js, puede utilizar _.size():

_.size({one : 1, two : 2, three : 3}); 
=> 3 
+0

Todavía tengo que ver la fuente, pero espero que 'size()' tenga 'hasOwnProperty' en cuenta. – RaphaelDDL

39

Esto está apoyado en Node.js y ambientes nuevos.

var obj = {a: "a", b: "b"}; 
Object.keys(obj).length // 2 
+0

No es compatible con IE8, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Browser_compatibility –

0

Aquí es función general de @Junaid Qadir Shekhanzai para "encontrar la longitud de un objeto" (que, como se nos dice, correctamente debería llamarse "contando las propiedades de un objeto"). Combina soluciones de @Ivo Wetzel y @ Martin Jespersen:

function countProperties(myObj){ 
    var length = 0; 
    if(typeof myObj != 'object'){ 
     return false; 
    } 
    for(var i in myObj) { 
    length++; 
    } 
    return length; 
} 
Cuestiones relacionadas