Если я не вкладываю операторы if / else, код не работает. Почему я должен гнездиться? - PullRequest
1 голос
/ 03 апреля 2019

обзор

Я изучаю JavaScript и выполняю упражнение, которое сочетает в себе доступ к свойствам объекта, циклам и операторам if / else.

Мой код не работает.Решение (которое работает) вкладывает операторы if / else, но в остальном, похоже, тот же код.Я не понимаю разницу.

инструкции к упражнению

  • Функция должна проверять, является ли имя фактическим именем первого контакта, а данное свойство (проп) является свойствомэтот контакт.

  • Если оба значения имеют значение true, вернуть «значение» этого свойства.

  • Если имя не соответствует ни одному контактузатем верните «Нет такого контакта»

  • Если свойство не соответствует никаким действительным свойствам контакта, найденного для совпадения имени, то верните «Нет такого свойства»

указанный массив

 var contacts = [
      {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
      },
      {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
      },
      {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
      },
      {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["JavaScript", "Gaming", "Foxes"]
      }
    ];

мой код

(который не работает)


function lookUpProfile(name, prop){

for (var i = 0; i < contacts.length; i++) {
    if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
        return contacts[i][prop];
    } else if (contacts[i].firstName !== name) {
        return "No such contact";
    } else {
        return "No such property";
    }
}

lookUpProfile("Sherlock", "likes"); 
//should return ["Intriguing Cases", "Violin"]

решение для тренировки

(котороеработает)

for (var x = 0; x < contacts.length; x++){
    if (contacts[x].firstName === name) {
        if (contacts[x].hasOwnProperty(prop)) {
            return contacts[x][prop];
        } else {
            return "No such property";
        }
    }
}
return "No such contact";

lookUpProfile("Sherlock", "likes"); 
//returns ["Intriguing Cases", "Violin"]

почему?

Я ожидал, что оба решения будут работать, но мое - нет.Почему?

Ответы [ 3 ]

3 голосов
/ 03 апреля 2019

В решении вы ищете контакт с подходящим именем.Как только вы найдете контакт с указанным именем, вы вернетесь, что означает, что цикл заканчивается (возможно, рано).То, что вы возвращаете, зависит от того, существует или нет реквизит, но вы действительно возвращаете.

В своей попытке вы каждый раз возвращаетесь на первую итерацию цикла.Вот как должен выглядеть ваш код, если вы хотите сохранить такое же поведение:

function lookUpProfile(name, prop){

    for (var i = 0; i < contacts.length; i++) {
        if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
            return contacts[i][prop];
        } else if (contacts[i].firstName === name && !contacts[i].hasOwnProperty(prop)) {
            return "No such property";
        }
    }

    return "No such contact";
}

Вы можете увидеть, как контакты [i] .firstName проверяются дважды в этом случае.Это потому, что вы не хотите выходить из цикла с возвратом, если вы еще не нашли контакт с указанным именем.Вложенность очищает это за счет сокращения повторяющихся проверок сложных условных выражений.

0 голосов
/ 05 апреля 2019

Ваш код не работает, потому что вы сразу же возвращаетесь, если имя не совпадает с данным именем.

Итак, давайте запустим вашу программу.

i = 0, мы сравниваем контакты [0] .name = Акира с Шерлоком. Имя соответствует Шерлоку? Нет. Так что ваше первое условие if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) { не выполняется. Мы переходим к следующему условию, иначе, если:

else if (contacts[i].firstName !== name) {
        return "No such contact";

И это условие верно. Поэтому мы немедленно вернемся.

Видите ли вы, как ваш код преждевременно возвращается? Это не позволяет нам действительно двигаться вперед.

Что вам нужно сделать, это поместить возврат за пределы цикла for. Я не буду давать вам точное решение, потому что это явно домашнее решение. Но подсказка должна продвинуть вас вперед.

0 голосов
/ 05 апреля 2019

Позже я понял, что частью проблемы было то, что я ленился с последней частью моего условного утверждения:

else { return "No such property"; }

Если бы я вместо этого выписал

if (contacts[x].firstName === name && !(contacts[x].hasOwnProperty(prop))

для удовлетворения этого требования:

  • Если свойство не соответствует каким-либо действительным свойствам контакта, для которого найдено совпадение с именем, верните «Нет такого свойства»

Я бы тогда видел это вложение, если бы утверждения были менее повторяющимися.

Другая проблема заключается в том, что последний «ленивый» оператор else предоставлял значение по умолчанию и всегда заканчивал функцию контактами [0]. Это означало, что только контакты [0] когда-либо будут проходить через функцию; дальнейших итераций с контактами нет [1]. контакты [2] и т. д. (Хороший опыт обучения!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...