Je travaille sur cette fonction d'animation mais j'ai un problème. Je n'arrive pas à effectuer ce qui devrait être une tâche facile, je ne peux pas obtenir la longueur d'un objet. Si vous vérifiez que jsFiddle vous voyez que je suis en train d’exécuter alert(properties.length);
et qu’il renvoie undefined
. Quelqu'un peut-il voir pourquoi cela pourrait être?
L'objet JavaScript n'a tout simplement que not une propriété length
, seulement Arrays
do. Si vous souhaitez connaître le nombre de propriétés définies sur un objet, vous devez les parcourir et les compter.
De plus, votre boucle for in
est sujette aux bogues en raison de l'extension Object.prototype
car in traversera la chaîne complète prototype et énumérera all les propriétés qui se trouvent sur la chaîne.
Exemple
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // logs both 'moo' AND 'bar'
}
Vous devez utiliser la méthode hasOwnProperty sur l'objet afin de filtrer ces propriétés indésirables.
// still the foo from above
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); // only logs 'moo'
}
}
De nombreux frameworks JavaScript étendent le prototype, ne pas utiliser hasOwnProperty
conduit souvent à des bugs horribles.
Mettre à jour
Concernant le problème actuel, votre code n'est pas une animation, mais les deux propriétés.
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);
}
....
}
Ceci est pris en charge dans node.js et les environnements plus récents.
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
Si vous utilisez Underscore.js , vous pouvez utiliser _.size()
:
_.size({one : 1, two : 2, three : 3});
=> 3
Les objets n'ont pas de longueur, vous devrez utiliser un tableau si vous le souhaitez.
Si vous devez trouver le nombre de propriétés dans un objet, il n'y a qu'un moyen:
var length =0;
for(var i in obj) length++;
Voici la fonction générale de @Junaid Qadir Shekhanzai pour "trouver la longueur d'un objet" (ce qui, comme on le dit, devrait être appelé à juste titre "compter les propriétés d'un objet"). Il combine les solutions de @Ivo Wetzel et @Martin Jespersen:
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}