What's the detailed explanation for why the 1st function is correct and the 2nd is wrong?

I understand that there are many easier and shorter ways of solving it but I want to grasp the concept behind the 2nd function in such a scenario. Solutions should be in the 2nd function format only and should be accompanied by a detailed explanation.

The logic

  • I have an array of objects representing different people in a contacts list.
  • The function should check if name is an actual contact’s firstName and the given property (prop) is a property of that contact.
  • If both are true, then return the “value” of that property.
  • If name does not correspond to any contacts then return the string No such contact.
  • If prop does not correspond to any valid properties of a contact found to match name then return the string No such property.

The object array

const contacts = [
  {
    firstName: "Akira",
    lastName: "Laine",
    number: "0543236543",
    likes: ["Pizza", "Coding", "Brownie Points"],
  },
  {
    firstName: "Harry",
    lastName: "Potter",
    number: "0994372684",
    likes: ["Hogwarts", "Magic", "Hagrid"],
  }
]

1st function (Correct)

function lookUpProfile(name, prop) {
  for (let 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("Akira", "likes");

2nd function (wrong)

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

lookUpProfile("Akira", "likes");