【问题标题】:Searching through an array of objects, properties of the objects being undefined?搜索对象数组,对象的属性未定义?
【发布时间】:2011-01-30 20:22:51
【问题描述】:

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;
    }
}

我将此 javascript 文件包含在一个 html 文档中。在 html 文档的脚本标签内,我有以下代码:

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

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

【问题讨论】:

    标签: javascript arrays object properties dynamic-arrays


    【解决方案1】:

    您正在寻找i 编号上的name 属性,而不是this.array 的成员i

    所以:

    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
    • @mhitza:这不是我的回答吗? ;o)
    • 大声笑,不知道我怎么错过了最后一句话:)
    • @mhitza:好吧,我最好在解决方案中也纠正循环。我猜是懒惰。 :o)
    【解决方案2】:

    切勿使用for...in (MDC documentation describes why) 循环遍历数组。使用普通的for 循环:

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

    for...in 无论如何都会遍历对象的 keys,这将是数组的索引。因此,for...in 循环的循环体必须与上面显示的for 循环完全相同。

    例如,如果你有这个,你会使用for...in

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

    进一步说明: 构造函数的名称以大写字母开头是惯例。

    【讨论】:

    • @TheDog:不,for...in 的主要原因是循环对象属性。
    • +1 你在处理容易出错的循环方面做得比我好。
    猜你喜欢
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多