Поиск в массиве объектов, свойства объектов не определены? - PullRequest
2 голосов
/ 30 января 2011

Пример кода 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 есть массив с элементом 0, который имеет имя "test1".Когда я использую контрольные точки для проверки кода, он показывает, что в данный момент вызывается предупреждение, i.name не определено .Что не так с этим?

Ответы [ 2 ]

2 голосов
/ 30 января 2011

Никогда не зацикливаться на массиве с for...in ( Документация MDC описывает , почему ). Используйте обычный цикл 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]);
}

Примечание: Условно начинать имя функций конструктора с заглавной буквы.

2 голосов
/ 30 января 2011

Вы ищете свойство name для числа i вместо члена i из 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, поскольку вы не перечисляете.

...