私はこれに取り組んでいます アニメーション関数 ですが、問題があります。簡単なタスクであるべきことを実行できないようで、オブジェクトの長さを取得できません。 jsFiddleを確認すると、alert(properties.length);
を実行しており、undefined
を返していることがわかります。なぜこれが起こるのか誰にもわかりますか?
JavaScriptオブジェクトは、単に[not_length
プロパティを持ち、Arrays
のみを持ちます。オブジェクトに定義されているプロパティの数を知りたい場合は、それらを繰り返してカウントする必要があります。
また、for in
ループは、Object.prototype
の拡張によるバグが発生しやすいため、完全なプロトタイプチェーンを通過して列挙allチェーン上にあるプロパティ。
例
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // logs both 'moo' AND 'bar'
}
これらの不要なプロパティを除外するには、オブジェクトで hasOwnProperty メソッドを使用する必要があります。
// still the foo from above
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); // only logs 'moo'
}
}
多くのJavaScriptフレームワークはプロトタイプを拡張しますが、hasOwnProperty
を使用しないと、ひどいバグが発生することがよくあります。
更新
コードがアニメーションの両方のプロパティではないという実際の問題について。
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);
}
....
}
これは、node.js以降の環境でサポートされています。
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
nderscore.js を使用している場合、_.size()
を使用できます。
_.size({one : 1, two : 2, three : 3});
=> 3
オブジェクトには長さがありません。必要な場合は配列を使用する必要があります。
オブジェクト内のプロパティの数を見つける必要がある場合、1つの方法しかありません。
var length =0;
for(var i in obj) length++;
「オブジェクトの長さを見つける」ための@Junaid Qadir Shekhanzaiの一般的な機能は次のとおりです(先ほど説明したように、「オブジェクトのプロパティをカウントする」と呼ばれるべきです)。 @Ivo Wetzelと@Martin Jespersenのソリューションを組み合わせています。
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}