1

次の関数を使用して、可変数のオブジェクトのプロパティを動的にチェックします。

// FUNCTION: Check Objects
var ObjectsN = 4;
function CheckObjects()
{
        for (var i=0; i<=ObjectsN; i++)
        {
            if ((eval("Object"+i+".property")==0)
            {
                if (i==ObjectsN)
                {
                    alert("Function finished");
                }
            }
            else
            {
                return; // end function
            }
        }
}

各オブジェクトが同じプロパティ値を持っているかどうかを確認する必要があります。
evalを使用せずに同じことを行う方法はありますか?実際の例をいただければ幸いです。

4

4 に答える 4

3

探している構造はArray. したがって、配列を使用してオブジェクトを保存します。

/* assuming `var Object1 = new Object(), Object2 = new Object();` and so on */
var objs = [ Object1, Object2, Object3 ];

hasOwnProperty次に、繰り返しながらプロパティのテストを実装する必要があります。

for (var o = 0; i < objs.length; o++){
  if (objs[o].hasOwnProperty('property')){
    // Property exists, test its value:
  }
}

次に、その値を取得するためにテストしobjs[o].property、期待したものと一致するかどうかを確認できます。

また、この機能を利用できないブラウザのために、hasOwnProperty( source、元は hereからの)クロスブラウザ バージョンを次に示します。

/*
Cross-browser hasOwnProperty solution, based on answers from:
https://stackoverflow.com/questions/135448/how-do-i-check-to-see-if-an-object-has-an-attribute-in-javascript
*/
if ( !Object.prototype.hasOwnProperty ) {
  Object.prototype.hasOwnProperty = function(prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
  };
}
于 2012-10-16T12:52:39.423 に答える
2

Object0Object1Object2Object3&Object4がグローバル変数であると仮定します。

を使用して変数にアクセスできますwindow

var ObjectsN = 4;
function CheckObjects()
{
    for (var i=0; i<=ObjectsN; i++)
    {
        if (window['Object'+i].property == 0)
        {
            if (i==ObjectsN)
            {
                alert("Function finished");
            }
        }
        else
        {
            return; // end function
        }
    }

}

于 2012-10-16T12:50:50.177 に答える
1

変数の番号付けについて考えているときはいつでも。代わりに配列を使用してください。

Object1Object2などはありません。[ x, y, x ]

次に、次のことができます。

for (var i = 0; i < objects.length; i++) {
    var obj = objects[i];
    if ("property" in obj) {
        // Whatever
    }
}
于 2012-10-16T12:48:57.787 に答える
1

Neverever の回答に似ていますが、使用可能なオブジェクトがあると仮定する代わりに、グローバル オブジェクトへの参照を渡しwindowます。

var ObjectsN = 4;
var CheckObjects = (function(global) {

    for (var i=0; i<=ObjectsN; i++) {
        if ( global['Object' + i].property == 0) {
            if (i == ObjectsN) {
                alert("Function finished");
            }
        } else {
            return; // end function
        }
    }
}

それがあなたが望むテストであると確信してい== 0ますか?プロパティが存在しなくても true を返します。この関数は特に堅牢ではありません。0 から n までのオブジェクトが存在しない場合、エラーがスローされます。

関数はObjectn.property == 0true を返している間だけ継続するため、truethy の結果が得られるとすぐに終了します (例: Object0.property = 'foo')。

于 2012-10-16T13:05:16.850 に答える