2013-06-05 4 views
2

Я проходил одно из упражнений javascript из java-кода и сталкивался с этим. Следующий код предоставляется кодексадой.базовый javascript - обращение к объекту в массиве

var friends = { 
    bill: { 
     firstName: "Bill", 
     lastName: "Gates", 
     number: "1", 
     address: ['abc', 'def', 'ghi'] 
    }, 
    steve: { 
     firstName: "Steve", 
     lastNAme: "Jobs", 
     number: "2", 
     address: ['abc', 'def', 'ghi'] 
    } 
}; 

var list = function(obj) { 
    for (var prop in obj) { 
     console.log(prop); 
    } 
}; 

var search = function(name) { 
    for (var prop in friends) { 
     if (friends[prop].firstName === name) { 
      console.log(friends[prop]); 
      return friends[prop]; 
     } 
    } 
}; 

То, что я не понимаю, в функции поиска, поэтому мне нужно выписывать «друзей [проп]» вместо того, чтобы просто «подпирать». Если цикл for/in выполняет итерацию через каждое свойство в друзьях (array?), Почему мне нужно снова указать, к какому массиву принадлежит каждый элемент? Почему я не могу использовать следующий код?

var search = function(name) { 
    for (var prop in friends) { 
     if (prop.firstName === name) { 
      console.log(prop); 
      return prop; 
     } 
    } 
}; 
+1

Ну, это потому, что для циклов в JavaScript немного сбивает с толку. Проверьте http: // stackoverflow.com/a/9329476/60518 –

+0

, пожалуйста, прочитайте редактирование, сделанное мной в ответ - это очень важно или вы можете столкнуться с неожиданными ошибками. – Christoph

ответ

6

prop на самом деле является имя имущества объекта (клавиша =), а не само имущество. Это простая строка ("bill"), а не фактический объект friends.bill (/ ссылка на него).

Это также причина, почему вы пишете

friends[prop] // prop gets evaluated here, it's value is the identifier 

вместо

friends.prop // prop is treated as the identifier here 

Пример:

var friends = { 
    bill: { ... 
    } 
} 
for (var prop in friends) { 
    // prop == "bill"; 
    friends[prop] == friends.bill 
} 

На самом деле, это похоже на (новый) Object.keys(friends) который возвращает вам массив всех имен свойств объекта, который вы могли бы затем повторить (что, возможно, я s более интуитивно понятный для людей, поступающих с других языков).

EDIT: Одно важное замечание!

В отличие от Object.keys(), for inсписков всех свойства вашего объекта, даже те, что унаследовали от своего прототипа. Так что если вы хотите, чтобы убедиться, что вы получите только ваше «родные» свойство, вы всегда должны check if it's a genuine property of the object:

for (var prop in friends) { 
    if (friends.hasOwnProperty(prop)){ 
     // it's a true property of your object 
    } 
} 
+0

Очень хорошее объяснение. – andlrc

2

for..in итерации для ключей объекта, а не ценности.

В случае, если вы знакомы с PHP:

foreach ($friends as $prop => $value) ... 

for..in только дает $prop, не $value. Чтобы получить $value, вам необходимо использовать $friends[$prop] или в Javascript-терминах friends[prop].

1

Вспомните переменную prop как ключ в сочетании клавиш-> значений.

В заявлении friends[prop] указывается ключ с именем prop значение объекта friends.

Если вы вместо того, чтобы сказать prop.firstname, вы на самом деле указать свойство firstname строки присвоенного prop, что не имеет никакого смысла, так как prop не является объектом.