Не могли бы вы объяснить мне этот блок кода? (Список контактов)
Я изучаю JavaScript самостоятельно, и я начал читать учебники и книги (например, Eloquent) и статьи (например, на Medium). Я также делаю несколько бесплатных курсов, в частности два: freeCodeCamp и CodeAcademy.
Сегодня мне пришлось столкнуться с упражнением со списком контактов на CodeAcademy, и я не уверен, что понял его правильно.
После некоторых подсказок, это последний код, который я придумал:
var friends = {
bill: {
firstName: "Bill",
lastName: "Gates",
number: "555 555 555",
address: ["One Miscrosoft Way", "Redmond", "WA", "98052"]
},
steve: {
firstName: "Steve",
lastName: "Jobs",
number: "333 333 333",
address: ["Apple's street", "Silicon Valley", "SV", "87368"]
}
};
var list = function(friends) {
for (var firstName in friends) {
console.log(firstName);
}
};
var search = function(name) {
for (var key in friends) {
if (friends[key].firstName === name) {
console.log(friends[key]);
return friends[key];
}
}
};
list(friends);
search("Steve");
.as-console-wrapper { max-height: 100% !important; top: 0; }
Я понял объект друзей Вар и первую функцию. Но как насчет второй функции? Почему мне нужно использовать "имя" и "ключевые" слова, если их нет в списке контактов. Не могли бы вы объяснить мне, что на самом деле делает код?
Кроме того, в конце упражнения CodeAcademy поместил этот последний код, чтобы сделать то, что я представляю:
list(friends);
search("Steve");
Что именно это?
3 ответа
Хорошо в этой функции:
var search = function(name) {
for (var key in friends) {
if (friends[key].firstName === name) {
console.log(friends[key]);
return friends[key];
}
}
};
переменная key
относится к каждому ключу объекта friends
в каждой итерации, что означает, что ее значение равно "bill" в первой итерации и "steve" во второй итерации.
name
является параметром этой функции search
, он не имеет фактического значения, пока функция не будет выполнена как search('Steve')
смотрите, вы назначаете значение 'Steve'
к этому.
Так, list(friends)
выведите "bill" и "steve" в консоль и search('Steve')
напечатает этот объект:
{
firstName: "Steve",
lastName: "Jobs",
number: "333 333 333",
address: ["Apple's street", "Silicon Valley", "SV", "87368"]
}
и верни это.
Итак, у вас есть var friends, который является объектом, который содержит каждого "друга", которые также являются объектами. Каждый из этих отдельных объектов друзей внутри var friends содержит свойства (имя, фамилия и т. Д.)
var search = function(name) {
for (var key in friends) {
if (friends[key].firstName === name) {
console.log(friends[key]);
return friends[key];
}
}
};
Это где вы заблудились, кажется. Итак, вы создаете поиск и устанавливаете его как функцию. Внутри функции вы передаете имя, на которое ссылается здесь friends[key].firstname === name
, [ключ] на самом деле ссылается на каждое из этих "друзей" свойств в "друзья", так что, например, ключ является ключом. Таким образом, он просматривает каждый из этих ключей (Билл, Стив и т. Д.) И устанавливает имя для этого имени, которое было передано ранее. Поэтому, когда вы используете эту функцию search("Steve");
на самом деле он найдет его в этом списке объектов и вернет все свойства, которые есть у "Стива", такие как адрес имени и т. д.
В основном, чтобы подвести итог. "Имя", которое передается в функции, просто позволяет вам искать через "друзей", а [ключ] позволяет циклу for искать все ключи друзей.
Смотрите: для... в циклах
// basically the same thing as doing
// function search(name){...}
// this just creates a function in this scope
var search = function(name) {
// for..in loop loops through the property
// names in the friends object
for (var key in friends) {
// "key" has the value of either "steve" or "bill"
// if key === steve then friends[key] is the same
// thing as doing friends.steve
// if friends.steve.firstName === name
if (friends[key].firstName === name) {
console.log(friends[key]);
return friends[key];
}
}
};