web-dev-qa-db-ja.com

JavaScriptオブジェクトリテラルの長さ===未定義?

私はこれに取り組んでいます アニメーション関数 ですが、問題があります。簡単なタスクであるべきことを実行できないようで、オブジェクトの長さを取得できません。 jsFiddleを確認すると、alert(properties.length);を実行しており、undefinedを返していることがわかります。なぜこれが起こるのか誰にもわかりますか?

38
Olical

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

これは、node.js以降の環境でサポートされています。

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

nderscore.js を使用している場合、_.size()を使用できます。

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

オブジェクトには長さがありません。必要な場合は配列を使用する必要があります。

オブジェクト内のプロパティの数を見つける必要がある場合、1つの方法しかありません。

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

「オブジェクトの長さを見つける」ための@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;
}
0