通过对象数组搜索,未定义对象的属性?
问题描述:
样品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
语句。
答
千万不要使用for...in
(MDC 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]);
}
此外应注意:这是惯例,开始的构造函数的名称以大写字母。
当循环访问数组元素时,不要使用`for ... in`。 – mhitza 2011-01-30 20:29:51
@mhitza:这不是我的答案所说的吗? ; o) – user113716 2011-01-30 20:30:53