通过对象数组搜索,未定义对象的属性?

问题描述:

样品javascript代码:通过对象数组搜索,未定义对象的属性?

function a() { 
    this.array1 = []; 
    this.addToArray = function(name) { 
     this.array1.push(new b(name)); 
     return true; 
    } 
    this.searchForName = function(name) { 
     for(var i in this.array1) { 
      alert(i.name); 
     } 
    } 
    function b(name) { 
     this.name = name; 
    } 
} 

我包含在HTML文件中这个JavaScript文件。 HTML文档的内部脚本标记我有这样的代码:

var myObject = new a(); 
myObject.addToArray("test1"); 
myObject.searchForName("test1"); 

运行这段代码,我希望在这"test1"警报弹出,而是它会弹出未定义。然而,Chrome中的调试器显示myObject中有一个数组,其名称为"test1"。当我使用断点来测试代码时,它显示在调用警报的那一刻,i.name未定义为。这有什么问题?

您正在寻找i号码的name房产,而不是的this.array会员。

所以:

i.name 

应该是:

this.array1[i].name 

结果是:

this.searchForName = function(name) { 
    for(var i in this.array1) { 
      // get it from this array1 
     alert(this.array1[i].name); 
    } 
} 

工作例如:http://jsfiddle.net/seNxD/

另外,如果您只对数字索引感兴趣,那么使用for-in语句并不是一个好主意。由于您没有枚举,所以使用for语句。

+0

当循环访问数组元素时,不要使用`for ... in`。 – mhitza 2011-01-30 20:29:51

+0

@mhitza:这不是我的答案所说的吗? ; o) – user113716 2011-01-30 20:30:53

千万不要使用for...inMDC documentation describes why)在阵列上循环。使用正常的循环for

for(var i = this.array1.length;i--;) { 
    alert(this.array1[i].name); 
} 

for...in环路在密钥对象的无论如何,这将是一个数组的索引。因此,for...in循环的循环体必须与上面所示的for循环完全相同。

例如,你可以使用for...in如果你有这样的:

var obj = {foo: 'bar', answer: '42'}; 
for(var key in obj) { 
    alert(key + " is " + obj[key]); 
} 

此外应注意:这是惯例,开始的构造函数的名称以大写字母。