在“for”中使用eval的替代方法

时间:2012-10-16 12:45:37

标签: javascript jquery html

我使用以下函数动态检查可变数量对象的属性。

// 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 个答案:

答案 0 :(得分: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进行测试,以检索其值,看看它是否与您期望的一致。

对于那些可能没有此功能的浏览器,以下是hasOwnPropertysource的跨浏览器版本,但最初来自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]);
  };
}

答案 1 :(得分:2)

假设Object0Object1Object2Object3&amp; 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
        }
    }

}

答案 2 :(得分:1)

每当你想到编号变量时。改为使用数组。

没有Object1Object2等。请[ x, y, x ]

然后你可以这样做:

for (var i = 0; i < objects.length; i++) {
    var obj = objects[i];
    if ("property" in obj) {
        // Whatever
    }
}

答案 3 :(得分: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'),它就会退出。