Вложенные операторы if & & (или) оператор - PullRequest
0 голосов
/ 26 августа 2018

Я пытался решить эту проблему https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript/profile-lookup/ с помощью следующего кода:

function lookUpProfile(name, prop){
for (let a = 0; a < contacts.length; a++) {
  if (contacts[a].firstName == name && contacts[a].hasOwnProperty(prop)) {
    console.log(contacts[a][prop]);
  }
    else if (name != contacts[a].firstName) {
      return "No such contact";
    }
     else {
       return "No such property";
     }
}

Однако на этой странице https://guide.freecodecamp.org/certifications/javascript-algorithms-and-data-structures/basic-javascript/profile-lookup предлагается следующее, и это работает:

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";

Я также попытался изменить вышеупомянутое к этому:

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

Но безрезультатно.Итак, мой вопрос: почему мой код не работает?И почему необходимо использовать вложенные операторы if вместо оператора &&?

Спасибо за внимание.

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Если ввод функции «Гарри», который находится во втором или третьем месте объекта, цикл не будет достигнут, потому что на первой итерации он перейдет к «Нет такого контакта» и прекратит работу функция!

0 голосов
/ 26 августа 2018

Используя созданную вами функцию, всегда будет возвращаться: contacts[x][prop]; или "No such property", и эта строка return "No such contact"; никогда не будет выполнена, Почему?

Путем вложениядва оператора if, новый оператор if, который будет возвращаться либо: contacts[x][prop];, если он проверяется на true, либо "No such property", если он проверяется на false и, следовательно, эта строка больше не будет выполняться /доступно, даже если условие contacts[x].firstName === name соответствует false.И именно поэтому используются два оператора if: первый возвращает "No such contact";, если он false (даже без оператора else, поскольку в первом операторе if ничего не будет выполнено, если он проверяется наfalse конечно, и, таким образом, функция переходит на следующую строку после того оператора if, который return "No such contact";)

Просто: ваша функция вернет "No such property" дажеесли contacts[x].firstName === name равно falsy.

Вот фрагмент для иллюстрации:

// some dummy values just for the demo !
var contacts = [
  {
    firstName: "ths",
    lastName: "sakh"
  },
  {
    firstName: "firstname",
    lastName: "lastname"
  }
];

/**
* The modified function
**/

var r = (function test(name, prop) {
for (var x = 0; x < contacts.length; x++) {
    if (contacts[x].firstName === name && contacts[x].hasOwnProperty(prop)) {
            return contacts[x][prop];
        } else {
            return "No such property";
        }
    }
  return "No such contact";
})("Wrong Name!", "firstName");
console.log('The modified function returned: "' + r + '" instead of return "No such contact"');

/**
* The original function
**/

var r = (function test(name, prop) {
  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";
})("Wrong Name!", "firstName");
console.log('The original function returned: "' + r + '" and that\'s what should be returned.');

Надеюсь, я подтолкнул вас дальше.

Ps: не паникуйте по синтаксису var r = (function(x, y){...}(arg1, arg2) это IIFE (он же (Immediately Invoked Function Expression)). Узнайте больше об этом.

0 голосов
/ 26 августа 2018

Каждая опубликованная вами функция (относительно двух последних) имеет уникальное поведение. Разница в том, что когда у вас есть contacts, в вашем измененном function, если выражение, которое вы проверяете с помощью оператора if, оценивается как false, "No such property" будет возвращено и вы вернете только "No such contact" в случае отсутствия contacts.

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