在 if 条件语句中访问 Javascript 个对象,可以吗?
Accessing Javascript objects inside if conditionals, can that be done?
这是我在 Free Code Camp Challenge "Profile Lookup" 中的代码,我被这段代码卡住了,我的问题是 if 条件,如何让测试用例进入我的第一个 if 条件?
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 (firstName !== contacts[i].firstName) {
return "No such contact";
}
else if (contacts[i].hasOwnProperty(prop) === false) {
return "No such property";
}
}
}
lookUpProfile("Harry", "likes");
我应该得到的是 "likes" 的值,即 ["Hogwarts"、"Magic"、"Hagrid"],要做到这一点,它应该进入第一个if条件,问题来了
你的问题是你return来早了。无论如何,如果满足任何条件,您总是 returning contacts
集合的第一次迭代。您需要做的是将答案存储在循环外的局部变量中,并 return 该值。这样做可以确保您已经完成所有迭代,而不会过早 returning。
试试这个:
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) {
var result = undefined;
for (var i = 0; i < contacts.length; i++) {
if (contacts[i].firstName === firstName) {
result = contacts[i];
}
}
if (result === undefined) {
return "No such contact";
}
if (result.hasOwnProperty(prop) === false) {
return "No such property";
}
return result[prop];
}
console.log(lookUpProfile("Harry", "likes"));
一种更实用和惯用的方法是使用数组方法,例如 filter。
可能是因为 "return" 退出 for 循环并在第一项之后停止。试试 "console.log"
if ( contacts[i].firstName === firstName && contacts[i].hasOwnProperty(prop)) {
console.log(i, contacts[i][prop]);
}
else if (firstName !== contacts[i].firstName) {
console.log(i, 'No such contact');
}
else if (contacts[i].hasOwnProperty(prop) === false) {
console.log(i, "No such property");
}
问题是您 return 在第一个 'for' 迭代中输入了一个值。
您需要使用一个新变量,将搜索分成两步,然后 return 结果。
function lookUpProfile(firstName, prop){
var contact;
for (var i = 0; i < contacts.length; i++) {
if (contacts[i].firstName === firstName) {
contact = contacts[i];
}
}
if (!contact) {
return "No such contact";
}
if (contact.hasOwnProperty(prop) === false) {
return "No such property";
}
return contact[prop];
}
您返回的时间太早,所以当第一个结果不匹配时"Harry",它会自动认为找不到联系人。
Seth 的回答将适用于您的用例,但我认为如果联系人在数组中的顺序不同,它会在其他用例中出错。如果在找到初始正确联系人后还有更多联系人要循环,则结果的值将在稍后的循环中被覆盖。
我会将 lookUpProfile 重写为如下内容:
function lookUpProfile(firstName, prop) {
var profile = null;
var err = null;
for (var i = 0; i < contacts.length; i++) {
if (firstName !== contacts[i].firstName) {
err = "No such contact";
} else if (contacts[i].hasOwnProperty(prop) === false) {
err = "No such property";
}
if (contacts[i].firstName === firstName && contacts[i].hasOwnProperty(prop)) {
profile = contacts[i][prop];
}
}
return (profile) ? profile : err;
}
你也可以查看我创建的 JSBin:http://jsbin.com/letesuhope/2/edit?js,console
这是我在 Free Code Camp Challenge "Profile Lookup" 中的代码,我被这段代码卡住了,我的问题是 if 条件,如何让测试用例进入我的第一个 if 条件?
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 (firstName !== contacts[i].firstName) {
return "No such contact";
}
else if (contacts[i].hasOwnProperty(prop) === false) {
return "No such property";
}
}
}
lookUpProfile("Harry", "likes");
我应该得到的是 "likes" 的值,即 ["Hogwarts"、"Magic"、"Hagrid"],要做到这一点,它应该进入第一个if条件,问题来了
你的问题是你return来早了。无论如何,如果满足任何条件,您总是 returning contacts
集合的第一次迭代。您需要做的是将答案存储在循环外的局部变量中,并 return 该值。这样做可以确保您已经完成所有迭代,而不会过早 returning。
试试这个:
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) {
var result = undefined;
for (var i = 0; i < contacts.length; i++) {
if (contacts[i].firstName === firstName) {
result = contacts[i];
}
}
if (result === undefined) {
return "No such contact";
}
if (result.hasOwnProperty(prop) === false) {
return "No such property";
}
return result[prop];
}
console.log(lookUpProfile("Harry", "likes"));
一种更实用和惯用的方法是使用数组方法,例如 filter。
可能是因为 "return" 退出 for 循环并在第一项之后停止。试试 "console.log"
if ( contacts[i].firstName === firstName && contacts[i].hasOwnProperty(prop)) {
console.log(i, contacts[i][prop]);
}
else if (firstName !== contacts[i].firstName) {
console.log(i, 'No such contact');
}
else if (contacts[i].hasOwnProperty(prop) === false) {
console.log(i, "No such property");
}
问题是您 return 在第一个 'for' 迭代中输入了一个值。 您需要使用一个新变量,将搜索分成两步,然后 return 结果。
function lookUpProfile(firstName, prop){
var contact;
for (var i = 0; i < contacts.length; i++) {
if (contacts[i].firstName === firstName) {
contact = contacts[i];
}
}
if (!contact) {
return "No such contact";
}
if (contact.hasOwnProperty(prop) === false) {
return "No such property";
}
return contact[prop];
}
您返回的时间太早,所以当第一个结果不匹配时"Harry",它会自动认为找不到联系人。
Seth 的回答将适用于您的用例,但我认为如果联系人在数组中的顺序不同,它会在其他用例中出错。如果在找到初始正确联系人后还有更多联系人要循环,则结果的值将在稍后的循环中被覆盖。
我会将 lookUpProfile 重写为如下内容:
function lookUpProfile(firstName, prop) {
var profile = null;
var err = null;
for (var i = 0; i < contacts.length; i++) {
if (firstName !== contacts[i].firstName) {
err = "No such contact";
} else if (contacts[i].hasOwnProperty(prop) === false) {
err = "No such property";
}
if (contacts[i].firstName === firstName && contacts[i].hasOwnProperty(prop)) {
profile = contacts[i][prop];
}
}
return (profile) ? profile : err;
}
你也可以查看我创建的 JSBin:http://jsbin.com/letesuhope/2/edit?js,console