【问题标题】:Where am I going wrong in this javascript code?我在这个 javascript 代码中哪里出错了?
【发布时间】:2018-07-13 00:15:55
【问题描述】:

我正在参加 freecodecamp 的第 217 个挑战,即个人资料查找。

这是问题定义

我们的联系人列表中有一组代表不同人的对象。 已经为您预先编写了一个以 firstName 和一个属性 (prop) 作为参数的 lookUpProfile 函数。 该函数应检查 firstName 是否是实际联系人的名字,并且给定的属性 (prop) 是该联系人的属性。 如果两者都为真,则返回该属性的“值”。 如果 firstName 不对应任何联系人,则返回“No such contact” 如果 prop 不对应任何有效属性,则返回“No such property”

我看到很多在“if”循环中使用相等运算符,但我想使用“hasOwnProperty”函数来解决它。我不知道我哪里出错了。

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(firstName, prop){
// Only change code below this line
  for(var i=0; i<contacts.length; i++)
  {
    
if(contacts.hasOwnProperty(firstName) && contacts.hasOwnProperty(prop))
  {
    return contacts.prop;
  }
  return "No such property";
  }
// Only change code above this line
}

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你需要比较firstName属性的实际值,(contacts[i].firstName == firstName)

    在 cmets 中查看更多详细信息。

    这里正在工作code

    // Code goes here
    
    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(firstName, prop){
       // Only change code below this line
       for(var i=0; i<contacts.length; i++){
          // use i as array index, to access particular contact object
          if((contacts[i].firstName == firstName) && contacts[i].hasOwnProperty(prop)){
               //dot notation will not work here, use []
               return contacts[i][prop];
          }
          return "No such property";
        }
       // Only change code above this line
    }
    
    // Change these values to test your function
    console.log(lookUpProfile("Akira", "likes"));

    【讨论】:

      【解决方案2】:

      问题是lookUpProfile 中的firstName 函数不是属性。它是 firstName 属性的值。

      当我们调用lookUpProfile("Akira", "likes") 时,您的代码会尝试检查数据中是否存在属性“Akira”(不存在)并且它不会返回该属性。您需要将 if 语句中的 contacts.hasOwnProperty(firstName) 替换为 contacts.firstName === firstName

      另外,你需要在你的循环中取得联系:

      var contact = contacts[i];
      

      【讨论】:

        【解决方案3】:

        您只是忘记在数组中查找对象,而不是整个数组:

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

        【讨论】:

        • 这行不通,因为传入的firstname 不是变量
        • @MB 是的,它不起作用。关于如何解决它的任何想法?
        • 无论如何,正如@oKonyk 指出的那样,如果名字的 if 语句是错误的。请参阅我的帖子的编辑以获取正确答案
        【解决方案4】:
        1. 您没有引用循环中的单个联系人contacts[i]
        2. 修复 if 语句以比较名字
        3. 您必须从如下变量中获取属性值

        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(firstName, prop){
        // Only change code below this line
          for(var i=0; i<contacts.length; i++)
          {
            
        if(contacts[i].firstName == firstName && contacts[i].hasOwnProperty(prop))
          {
            //return contacts[i].prop;
             alert(contacts[i][prop]);
          }
          //return "No such property";
           alert("No such property");
          }
        // Only change code above this line
        }
        
        // Change these values to test your function
        lookUpProfile("Akira", "likes");

        【讨论】:

          【解决方案5】:

          上述代码适用于一个测试用例,但不适用于通过会话所需的所有测试用例。

              function lookUpProfile(firstName, prop){
              for (i = 0; i < contacts.length; i++) {
                  if (contacts[i].hasOwnProperty(prop)) {
                      if (contacts[i].firstName == firstName) {
                          return contacts[i][prop];
                      }
                  }
                  else {
                      return "No such property";
                  }
              }
              return "No such contact";
              }
          

          【讨论】:

            【解决方案6】:

            Here is the solution to this problem 
            
            function lookUpProfile(firstName, prop){
                for (var i = 0; i < contacts.length; i++) {
                    if (contacts[i].firstName == firstName && prop in contacts[i]) {
                        return contacts[i][prop];
                    } else if (!(firstName in contacts[i]) && i == (contacts.length - 1)) {
                        return "No such contact";
                    } else if ((typeof contacts[i][prop] == 'undefined')) {
                        return "No such property";
                    }
                }

            【讨论】: