2011-01-14 10 views
33

Pracuję nad tym animation function, ale mam problem. Nie mogę wykonać zadania, które powinno być łatwe, nie mogę uzyskać długości obiektu. Jeśli sprawdzisz, że jsFiddle widać, że jestem uruchomiony alert(properties.length); i wraca undefined. Czy ktokolwiek może zrozumieć, dlaczego tak się dzieje?Długość literału obiektu JavaScript === niezdefiniowana?

+2

możliwe duplikat [Długość JavaScript asocjacyjna] (http://stackoverflow.com/questions/5223/length-of-javascript-associative-array) – ripper234

Odpowiedz

38

obiekt JavaScript prostu zrobić nie mają właściwość length tylko Arrays zrobić. Jeśli chcesz poznać liczbę właściwości, które są zdefiniowane w obiekcie, musisz wykonać iterację i policzyć je.

Ponadto, pętla for in jest podatny na błędy z powodu przedłużenia Object.prototype ponieważ w będą przemierzać pełną prototyp łańcuch i wyliczyć wszystkie właściwości, które są na łańcuchu.

Przykład

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

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

trzeba stosować metody hasOwnProperty od obiektu w celu odfiltrowania tych niepożądanych właściwości.

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

Wiele środowisk JavaScript tam przedłużyć prototyp, nie używając hasOwnProperty często prowadzi do strasznych błędów.

Aktualizacja

chodzi o rzeczywisty problem, że kod nie jest animacja zarówno właściwości.

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

Na tej samej liczbie wiele bibliotek tam (takich jak jQuery) rozpadnie się strasznie, jeśli rozszerzysz object.prototype, więc jeśli użyjesz jednej z nich hasOwnProperty to po prostu marnowanie cykli procesora. –

+0

@Martin Jespersen Sprzedajesz więc kod z napisem "OSTRZEŻENIE WYKORZYSTUJESZ WYŁĄCZNIE Z RAMAMI A, B, C"? Przykro nam, ale używanie 'hasOwnProperty' * jest ** dobrą praktyką. –

+0

Nie mam już dość sieci wypełnionej kodem javascript, który jest tak daleki od zoptymalizowania, że ​​nawet chromowane dławiki na nim, to znowu, myślę, że powinienem być wdzięczny, ponieważ zarabiam pieniądze na sprzątaniu bałaganu, który inni robią: P –

0

Obiekty nie mają długości, w razie potrzeby należy użyć tablicy.

Jeśli trzeba znaleźć liczbę właściwości w obiekcie istnieje tylko jeden sposób:

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

Użyj hasOwnProperty, proszę. –

+1

Dlaczego, jak? Do czego ma zastosowanie hasOwnProperty? – Olical

+0

Lepiej po prostu * nie * zaktualizować Object.prototype? Kto tak robi? To naprawdę świetny przykład! –

11

Jeśli używasz Underscore.js, można użyć _.size():

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

Nie widziałem jeszcze źródła, ale mam nadzieję, że 'size()' bierze pod uwagę 'hasOwnProperty'. – RaphaelDDL

39

ten jest obsługiwany w środowiskach node.js i nowszych.

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

Brak obsługi w IE8, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Browser_compatibility –

0

Oto ogólna funkcja @Junaid Qadir Shekhanzai dla „znalezienie długość obiektu” (który, jak powiedziano nam, powinny być właściwie zwanego „liczenie właściwości obiektu”). Łączy on w sobie rozwiązania z @Ivo Wetzel i @Martin Jespersen:

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