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

时间:2018-06-18 23:43:03

标签: javascript for-loop if-statement hasownproperty

我正在使用freeCodeCamp javascript并且卡在“profile lookup”练习上因为我忘记了.hasOwnProperty()函数,但我仍然不确定为什么我的原始函数不起作用。我将离开给定阵列的一部分以供参考。

self.user.username = newName

当我遗漏我的

//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")

行可行,但无论“prop”输入是什么,否则只返回“No such property”。

3 个答案:

答案 0 :(得分:1)

在您的代码中:

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所发现的那样,您要做的是测试每个密钥,如果您到达目的地,则返回“No such property”:

for(let y in contacts[x]){
  if(prop === y){
    return contacts[x][prop]; 
  }
}
return "No such property";
顺便说一句,请使用更多的空白区域 - 在一行上将所有东西堵塞起来要难得多。

答案 1 :(得分:1)

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

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

根据您的代码,您只检查联系人对象的第一个属性,因为如果检查的当前属性与正在查找的属性不匹配,则if else语句将不返回任何属性。这个条件使得它不会检查剩下的属性而只检查第一个属性(无论它是否正确)

要解决此问题,请将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";
  }
}

这样,如果你完成循环并且仍然没有找到有效的属性,它将正确地返回"没有这样的属性"消息,反之亦然,如果您找到了正确的属性,它将返回属性值

答案 2 :(得分:0)

将你的内部循环中的if条件的一部分移出该循环。因为,在比较第一个属性后,代码执行正在返回。