对于此对象数组:
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"]
}
];
然后有一个for
循环,它遍历对象数组和要在对象上查找的参数。我知道我们正在迭代,函数会在returns
之后停止运行。我包含了一个console.log(i);
来查看迭代器变量的值,以查看循环发生了多少次。
function lookUpProfile(name, prop) {
for (var i = 0; i < contacts.length; i++) {
console.log(i);
if (contacts[i].firstName === name) {
if (contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop]
} else {
return "No such property";
}
}
} //end of loop
return "No such contact";
}
console.log(lookUpProfile("Kristian", "lastName")); // Vos
所以我运行代码并查看我的控制台输出,得到我期望的结果,我们迭代4次,然后我们return
当前对象属性。
为什么当我重构函数时,代码不能工作,所以我使用逻辑AND运算符&&
,它将两个测试条件组合成一个if
语句,而不是使用两个嵌套的if
条件-如下所示:
function lookUpProfile(name, prop) {
for (var i = 0; i < contacts.length; i++) {
console.log(i);
if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop]
} else {
return "No such property";
}
} //end of loop
return "No such contact";
}
console.log(lookUpProfile("Kristian", "lastName")); // Expected output: Vos
现在,当我运行代码时,似乎没有发生迭代,因为console.log(i);
似乎只输出一次undefined
,而不是多次输出,所以我们似乎没有循环,我不明白为什么。其次,即使我们的测试条件得到满足,我们也会返回“没有这样的属性”。
如果这个简单的重构破坏了函数,我需要理解的是。我知道一旦函数返回一些东西,函数执行就会结束,迭代就会停止,我认为这个问题与循环之外和控制流中断有关,但我不明白为什么。请有人清楚地解释为什么在我的具体案例中会发生这种情况。
发布于 2019-07-13 12:14:45
如果嵌套了if条件
if (contacts[i].firstName === name)
如果name不匹配,则此函数检查name。它不执行任何操作
但在第二个示例中,在if之后的else语句中返回,如果case name不匹配,则从函数返回
if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop]
} else { // problem is here
return "No such property";
}
只需从循环中删除else条件
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(name, prop) {
for (var i = 0; i < contacts.length; i++) {
if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop)) {
return contacts[i][prop]
}
} //end of loop
return "No such contact";
}
console.log(lookUpProfile("Kristian", "lastName"));
发布于 2019-07-13 12:13:35
因为在前面的代码中,只有当contacts[i].hasOwnProperty(prop)
为false
时才返回"No such property"
。现在,如果contacts[i].firstName === name
为false,也会返回。您希望将这两个if
块分开。
此外,console.log(i)
打印undefined
的原因还在于它位于for
循环之上,在i
变量的声明之前。将其下移1行。
https://stackoverflow.com/questions/57019030
复制