2016-12-24 63 views
0

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

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

如果你想想看,你的代码需要看起来像这样:

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,而且你不想在你浏览完所有参赛作品之前决定是否有这样的联系。

要找到这样的逻辑错误,通常需要用调试器一行一行地浏览代码,仔细观察它的功能。

在“现代” 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"; 
} 
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块,它将从该函数返回。 Return应该写在for循环之后。

+0

我不明白这是如何解决这个问题的。 – 2016-12-24 05:19:32

+0

当数组正在寻找第0个元素时,条件将不会得到满足,所以它将转到第3个else块如果它将从函数返回。返回应该写在循环之后。 –

1

要检查每个联系人的姓名,如果不相等你是返回,因为没有接触存在,当克里斯汀接触变得不与它不返回任何接触,从循环 这就是当你移动他们预期

你的代码更改为以下

//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);
工作的原因存在的第一次接触 希望它有帮助

+0

此代码将错误地报告“没有这样的属性”的情况下,**不匹配名称的前一个条目没有该属性。此外,'noProp'结尾的测试将不起作用,因为无论如何将'noProp'设置为true后函数立即返回。 – 2016-12-24 05:50:07

+0

谢谢你会相应改变 – Geeky