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来源,但最初来自 这里):

/*
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

假设Object0, Object1, Object2, Object3&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

每当您考虑对变量进行编号时。请改用数组。

没有Object1,Object2等 有[ 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 == 0返回 true 时继续运行,因此它会在得到一个真实的结果后立即退出(例如Object0.property = 'foo')。

于 2012-10-16T13:05:16.850 回答