JavaScript条件语句未按预期工作

时间:2016-12-24 05:13:21

标签: javascript

当firstName和property为true时,该函数不显示属性 - 它只是移动到我的其他条件并显示“未找到联系人”。但是,当我在'for'循环之外放置我的最后一个返回“找不到联系人”时,代码完美无缺。

//Setup
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];
       }else if (contacts[i].hasOwnProperty(prop) === false){
           return "No such property";
       }else if (contacts[i].firstName !== firstName){
           return "No such contact";
       }

  }


// Only change code above this line
}

// Change these values to test your function
lookUpProfile("Kristian", "lastName");

3 个答案:

答案 0 :(得分:3)

如果您考虑一下,您的代码需要如下所示:

function lookUpProfile(firstName, prop) {
  for (var i = 0; i < contacts.length; i++) {
    const contact = contacts[i];

    if (contact.firstName === firstName) {
      if (contact.hasOwnProperty(prop)) return contact[prop];
      else return "No such property";
    }
  }

  return "No such contact";
}

在您知道自己与firstName合适的人之前,您不想决定没有此类财产,并且您不想在此之前确定没有这样的联系你已经完成了所有的参赛作品。

要查找这样的逻辑错误,通过调试器逐行浏览代码通常很有帮助,并确切地了解它的作用。

现代&#34; JS样式也可以写成

function lookUpProfile(firstName, prop) {
  const entry = contacts.find(contact => contact.firstName === firstName);

  return !entry ? "No such contact" : 
    entry.hasOwnProperty(prop) ? entry[prop] : "No such property";
}

或者,如果您发现三元(?)运算符太难阅读,那么

  if (!entry) return "No such contact";
  if (!entry.hasOwnProperty(prop)) return "No such property";
  return entry[prop];

如果您打算进行大量这些查找,请准备一份由firstname索引的地图:

const map = new Map(contacts.map(contact => [contact.firstName, contact]));

现在,您可以在接近O(1)时间的地方编写查询:

function lookUpProfile(firstName, prop) {
  const entry = map.get(firstName);

  return entry ? "No such contact" : 
    contact.hasOwnProperty(prop) ? contact[prop] : "No such property";
}

答案 1 :(得分:1)

您正在检查每个联系人的名字,如果他们不相等,您将返回,因为没有联系人,当克里斯汀联系与第一个联系人变得不相等时,它返回没有联系人并且存在来自for循环 这就是你移动它们按预期工作的原因

将您的代码更改为以下

//Setup
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(first_Name, prop) {
  var contactExists = false;
  var noProp = false;
  // Only change code below this line
  for (var i = 0; i < contacts.length; i++) {

    if (contacts[i].firstName === first_Name && contacts[i].hasOwnProperty(prop)) {
      contactExists = true;
      return contacts[i][prop];
    }
    if (contacts[i].hasOwnProperty(prop) === false) {
      noProp = true;
      return "No such property";
    }
  }
  if (!contactExists || !noProp) {
    return "No such contact";
  }

}


// Change these values to test your function
var res = lookUpProfile("Kristian", "lastName");
console.log(res);
希望它有所帮助

答案 2 :(得分:0)

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];
       }else if (contacts[i].hasOwnProperty(prop) === false){
           return "No such property";
       }else if (contacts[i].firstName !== firstName){
           return "No such contact";
       }

  }


// Only change code above this line
}

删除two else if条件,因为它从函数返回阻止进一步查找。
当数组正在寻找第0个元素时,条件将不会被满足,因此它将转到3rd else if块,它将从函数返回。应该在for循环之后写Return