Не могли бы вы объяснить мне этот блок кода? (Список контактов)

Я изучаю 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];
        }
    }
};
Другие вопросы по тегам