2011-01-30 3 views
2

Пример яваскрипт кода:Поиск по массиву объектов, свойства объектов, которые не определены?

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

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

+0

Не используйте 'for ... in' при переходе по элементам массива. – mhitza

+0

@mhitza: Разве это не то, что мой ответ говорит? ; o) – user113716

+0

Lol, dunno, как я пропустил последнее предложение :) – mhitza

2

Никогда не перегибайте массив с помощью 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]); 
} 

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

+0

@ TheDog: Нет, основной причиной для 'for ... in' является переключение свойств объекта. –

+0

+1 Вы сделали лучшую работу, чем я, имея дело с циклом с ошибкой. – user113716

Смежные вопросы