我可以使用带有 if 语句的 for 循环代替 .hasOwnProperty()

Can I use a for loop with if statement in place of .hasOwnProperty()

我正在完成 freeCodeCamp javascript 并卡在了 "profile lookup" 练习中,因为我忘记了 .hasOwnProperty() 函数,但我仍然不确定为什么我的原始函数没有不行。我将留下给定数组的一部分以供参考。

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


function lookUpProfile(name, prop){
// Only change code below this line
for(let x in contacts){
  if(name === contacts[x].firstName){
    for(let y in contacts[x]){
      if(prop === y){
        return contacts[x][prop]; 
      } else {return "No such property";}
    }
  } 
 } return "No such contact";
// Only change code above this line
}

// Change these values to test your function
lookUpProfile("Akira", "likes")

当我遗漏我的

else {return "No such property";}

行有效,但除此之外,无论 'prop' 输入是什么,都只是 returns "No such property"。

在您的代码中:

for(let y in contacts[x]){
  if(prop === y){
    return contacts[x][prop]; 
  } else {return "No such property";}
}

如果proplikes,例如,第一次循环y可能等于firstNameif ("likes" === "firstName") 是假的,所以我们 return "No such property";.

正如您通过删除 else 发现的那样,您要做的是测试每个键,然后 return "No such property" 如果您到达最后:

for(let y in contacts[x]){
  if(prop === y){
    return contacts[x][prop]; 
  }
}
return "No such property";

顺便说一句,请使用更多的白色 space - 将内容挤在一行上会更难阅读。

您的问题是循环中的 if else 语句:

if(prop === y){
  return contacts[x][prop]; 
} else {
  return "No such property";
}

根据您的代码,您只检查联系人对象的第一个 属性,因为如果当前 属性 是,您的 if else 语句 returns no 属性 checked 与正在查找的不匹配。这种情况使得它不检查其余属性,只检查第一个属性(不管它是否正确)

要解决此问题,请将 return 语句移动到用于检查属性的循环的末尾:

for(let x in contacts){
  if(name === contacts[x].firstName){
    for(let y in contacts[x]){
      if(prop === y) return contacts[x][prop]; 
    }
    return "No such property";
  }
}

这样,如果您完成循环但仍未找到有效的 属性,它将正确 return "no such property" 消息,反之亦然,如果您找到正确的 属性,它将 return 属性 值

只需将内循环中 if 条件的 else 部分移出该循环。因为,代码执行在比较第一个 属性.

之后立即返回