【问题标题】:Nested for loop - Javascript FreeCodeAcademy question嵌套 for 循环 - Javascript FreeCodeAcademy 问题
【发布时间】:2020-04-01 14:43:20
【问题描述】:

通过代码学院学习 javascript 并遇到问题“基本 JavaScript:配置文件查找”。我在互联网上找到了一个更简单的解决方案,但我想知道为什么下面的代码不起作用所以我可以从错误中吸取教训。谢谢。

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

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) {
        for (var j = 0; j < contacts[i].length; j++) {
            if (contacts[i][j] === prop) {
                return contacts[i][j];
            } else {
                return "No such property";
            }
        }
    } else {
        return "No such contact";
        }
    }

lookUpProfile("Akira", "likes");

【问题讨论】:

  • return 终止函数
  • 抱歉,您能进一步解释一下吗?为什么函数不应该在我拥有的位置终止?不是返回函数正在寻找的答案吗?所以在那之后函数就不需要继续了
  • (尝试使用调试器;)) - 否则分支测试名称总是return,应该检查它是否是最后一个索引

标签: javascript for-loop


【解决方案1】:

发布了一条带有部分答案的评论

return 终止函数

你问了

抱歉,您能进一步解释一下吗?为什么函数不应该在我拥有的位置终止?不是返回函数正在寻找的答案吗?所以之后函数就不需要继续了

您的代码遍历所有联系人,并打算找到匹配项。如果在第一次接触时没有找到匹配项,则它会退出该功能,而无法尝试其余的接触。


您的代码还存在一些其他问题。规范说:

该函数应检查 name 是否是实际联系人的名字,并且给定的属性 (prop) 是该联系人的属性。如果两者都为真,则返回该属性的“值”。

您正确检查了第一位,但第二位您检查的是属性的 ,而不是属性的名称:

for (var j = 0; j < contacts[i].length; j++) {
    if (contacts[i][j] === prop) {

您应该改为循环遍历 Object.keys(contacts[i])

var keys = Object.keys(contacts[i])
for (var j = 0; j < keys.length; j++) {
    if (keys[j] === prop) {

事实上,整件事可以用几行写出来。

function lookUpProfile(name, prop){
    var contact = contacts.find(x => x.firstName == name);
    if(contact == null)
      return "No such contact";
    var prop = Object.keys(contact).find(x => x == prop);
    if(prop == null)
      return "No such property";
    return contact[prop];
}

下面的实例

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){
    var contact = contacts.find(x => x.firstName == name);
    if(contact == null)
      return "No such contact";
    var prop = Object.keys(contact).find(x => x == prop);
    if(prop == null)
      return "No such property";
    return contact[prop];
}

console.log(lookUpProfile("Akira", "likes"));
console.log(lookUpProfile("Kristian", "foo"));
console.log(lookUpProfile("Bob", "bar"));

【讨论】:

  • 是的,谢谢,我能够修正我的答案并了解我在您的更正中出了什么问题
【解决方案2】:

您不会使用索引遍历对象属性。
在第二个循环中

   {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    }

对象无法通过索引访问,因此必须通过属性名称访问。

无论如何这是简化的答案

function lookUpProfile(name, prop){
  contact = contacts.find(item => item.firstName == name)
  return contact[prop]
}

result = lookUpProfile("Akira", "likes")
console.log(result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多