我使用以下函数动态检查可变数量对象的属性。
// 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的情况下做同样的事情?
一个真实的例子将非常受欢迎。
答案 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
进行测试,以检索其值,看看它是否与您期望的一致。
对于那些可能没有此功能的浏览器,以下是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]);
};
}
答案 1 :(得分:2)
假设Object0
,Object1
,Object2
,Object3
&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)
每当你想到编号变量时。改为使用数组。
没有Object1
,Object2
等。请[ 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'
),它就会退出。