Lunghezza letterale dell’object JavaScript === undefined?

Sto lavorando a questa funzione di animazione ma ho un problema. Non riesco a eseguire quello che dovrebbe essere un compito facile, non riesco a ottenere la lunghezza di un object. Se controlli che jsFiddle puoi vedere che sto facendo l’ alert(properties.length); e sta tornando undefined . Qualcuno può capire perché questo potrebbe essere?

L’object JavaScript semplicemente non ha una proprietà length , solo gli Arrays fanno. Se si desidera conoscere il numero di proprietà definite su un object, è necessario eseguirne l’iterazione e contarle.

Inoltre, il ciclo for in è incline a bug dovuti all’estensione di Object.prototype poiché attraverserà la catena del prototipo completo e enumererà tutte le proprietà presenti sulla catena.

Esempio

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

Devi usare il metodo hasOwnProperty sull’object per filtrare quelle proprietà indesiderate.

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

Molti framework JavaScript là fuori estendono il prototipo, non usando hasOwnProperty spesso porta a bug orribili.

Aggiornare

Riguardo al problema reale che il tuo codice non è l’animazione di entrambe le proprietà.

 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); } .... } 

Questo è supportato in node.js e negli ambienti più recenti.

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

Se stai usando Underscore.js , puoi usare _.size() :

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

Gli oggetti non hanno lunghezza, dovrai usare un array se lo desideri.

Se devi trovare il numero di proprietà in un object, c’è solo un modo:

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

Ecco la funzione generale di @Junaid Qadir Shekhanzai per “trovare la lunghezza di un object” (che come ci viene detto dovrebbe essere correttamente chiamato “contare le proprietà di un object”). Combina soluzioni di @Ivo Wetzel e @ Martin Jespersen:

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