【问题标题】:Could you explain me this block of code? (Contact List)你能解释一下这段代码吗? (联系人列表)
【发布时间】:2017-05-12 20:14:03
【问题描述】:

我正在自学 JavaScript,我从阅读教程和书籍(如 Eloquent)和文章(例如 Medium)开始。我也在做一些免费课程,特别是两个:freeCodeCamp 和 CodeAcademy。

今天我不得不面对 CodeAcademy 上的联系人列表练习,我不确定我是否理解正确。

经过一些提示,这是我想出的最终代码:

var friends = {
  bill: {
    firstName: "Bill",
    lastName: "Gates",
    number: "555 555 555",
    address: ["One Miscrosoft Way", "Redmond", "WA", "98052"]
  },
  steve: {
    firstName: "Steve",
    lastName: "Jobs",
    number: "333 333 333",
    address: ["Apple's street", "Silicon Valley", "SV", "87368"]
  }
};

var list = function(friends) {
  for (var firstName in friends) {
    console.log(firstName);
  }
};

var search = function(name) {
  for (var key in friends) {
    if (friends[key].firstName === name) {
      console.log(friends[key]);
      return friends[key];
    }
  }
};

list(friends);
search("Steve");
.as-console-wrapper { max-height: 100% !important; top: 0;  }

我理解了 var friends 对象和第一个函数。 但是第二个功能呢?如果他们不在联系人列表中,为什么我需要使用“姓名”和“关键”词。你能解释一下代码的真正作用吗?

另外,在练习结束时,CodeAcademy 把这个最终代码用来做我想象的事情:

list(friends);
search("Steve");

究竟是什么?

【问题讨论】:

  • 当您执行function(name){} 时,name 指的是您提供的参数。 for(var key in friends) 也一样。您在此处定义 var key,它在此循环的每次迭代中都会发生变化。此外,如果您使用对象数组而不是带有对象的对象,则此练习会更好。查一下javascript方括号[ ]和大括号{ }的区别
  • for (var key in friends) { 可能是 for (var friend in friends) { 然后是 friends[friend] - 他们选择将变量命名为 key 因为它是一个键 - name 被传入并包含“Steve "
  • name 是搜索函数的输入参数,您在调用搜索函数时传递该参数。 Key 是一个变量名,您使用它来迭代朋友对象

标签: javascript function object javascript-objects contact-list


【解决方案1】:

在这个函数中:

var search = function(name) {
    for (var key in friends) {
        if (friends[key].firstName === name) {
            console.log(friends[key]);
            return friends[key];
        }
    }
};

变量key在每次迭代中引用对象friends的每个键,这意味着它的值在第一次迭代中是'bill',在第二次迭代中是'steve'。

name 是这个函数search 的一个参数,直到函数像search('Steve') 一样执行,它才有实际值,看你给它赋值'Steve'。

所以,list(friends) 在控制台打印 'bill' 和 'steve',search('Steve') 将打印这个对象:

{
    firstName: "Steve",
    lastName: "Jobs",
    number: "333 333 333",
    address: ["Apple's street", "Silicon Valley", "SV", "87368"]
}

并返回它。

【讨论】:

  • 谢谢!因此,例如,如果我想使用其他术语而不是 key 和 name 它会是一样的吗?现在它更有意义了。
  • 是的,您可以使用其他词代替key 和name,它的工作方式相同。 @刘易斯
【解决方案2】:

见:for...in loops

// basically the same thing as doing 
// function search(name){...}
// this just creates a function in this scope
var search = function(name) {

    // for..in loop loops through the property 
    // names in the friends object
    for (var key in friends) {

        // "key" has the value of either "steve" or "bill"
        // if key === steve then friends[key] is the same 
        // thing as doing friends.steve

        // if friends.steve.firstName === name
        if (friends[key].firstName === name) {
            console.log(friends[key]);
            return friends[key];
        }
    }
};

【讨论】:

    【解决方案3】:

    好的,所以你有 var friends,它是一个对象,其中包含每个“朋友”也是对象。 var friends 中的每个单独的朋友对象都包含属性(名字、姓氏等)

    var search = function(name) {
        for (var key in friends) {
            if (friends[key].firstName === name) {
                console.log(friends[key]);
                return friends[key];
            }
        }
    };
    

    这似乎是你迷路的地方。好的,所以您创建搜索并将其设置为函数。在函数内部传递名称,此处引用 friends[key].firstname === name。 [key] 实际上引用了 'friends' 中的每一个 'friend' 属性,因此例如 bill 就是一个键。因此,它查看这些键中的每一个(bill、steve 等)并将其的 firstname 设置为 name,这是之前传递的。因此,当您使用该函数search("Steve"); 时,它实际上会在该对象列表中找到他并返回“史蒂夫”具有的所有属性,例如名字地址等。

    基本上总结一下。函数中传递的“姓名”只允许您搜索“朋友”,而 [key] 将允许 for 循环搜索朋友的所有键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2021-04-22
      相关资源
      最近更新 更多