zoukankan      html  css  js  c++  java
  • FreeCodeCamp:Profile Lookup

    task:

    我们有一个对象数组,里面存储着通讯录。

    函数 lookUp 有两个预定义参数:firstName值和prop属性 。

    函数将会检查通讯录是否存在一个联系人的firstName属性等于firstName值,还会检查对应联系人是否存在 prop属性。

    如果它们都存在,函数返回prop属性对应的值。

    如果firstName 值不存在,返回 "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"]
        }
    ];


    拿到题目后首先用了for循环,下面是代码。

        function lookup(firstName,prop) {
            for (var i = 0; i < contacts.length; i++) {
                if (contacts[i].firstName == firstName) {
                    if (contacts[i].hasOwnProperty(prop)) {
                        return contacts[i].prop;
                    } else {
                        return 'no such property';
                    }
                }else{
                    return 'no such contact';
                }
            }
        }

    提交代码后并没有通过(逃 

    之后拿去打断点调试发现存在两个问题 请往下看

    问题1: contacts[i].prop 总是返回undefined

      有两个可能导致这个问题。一是上面的if条件写错。二是contacts[i].prop表达式不合法。

      由于if条件可以正常返回true or false 所以排除这个原因。然后我改用contacts[i][prop]显示了正确结果。经过自己的测试对比发现 点操作 并不能用于通过变量获取属性。举个栗子。

        var arr = [
            {
                "name": 'qi',
                "hobby":['a','b','c']
            }, {
                "name": 'zz',
                "hobby": ['x', 'y', 'z']
            }
        ];
        var str = 'hobby';
        if (arr[0].hasOwnProperty('hobby')) {
            alert(arr[0][str]); //a,b,c
            alert(arr[0].str); //undefined
        }

      点操作取不到值别怕,我们可以使用中括号操作符。当通过变量名访问属性的时候,不需要给变量名包裹引号。因为实际上我们使用的是变量的值,而不是变量的名称。但用普通方式获取属性的时候需要加引号:arr[0]['hobby']。另外属性名中有空格的情况下只能用中括号操作符获取属性值:arr[0]['pop dog'].

    总结:1. 通过变量获取属性值时不能用点操作符必须使用中括号。2. 属性名中有空格或连字符等特殊符号时需要中括号。

    问题2: for循环执行一次整个函数就返回

      还未遍历到想要查找的联系人就已经退出了。必须该返回的时候返回,不该返回的时候继续往下执行。如果要用for循环也只能在循环里设置一个 return 出口。

    正确实现:先找出符合 firstName 的一个组,后判断里面是否有prop属性。

        function lookup(firstName,prop){
            var result=contacts.filter(function(item){
                return item.firstName == firstName;
            });
            if(result.length){
                //符合的结果组只有一个
                return result[0][prop]?result[0][prop]:'no such property'
            }
            return 'no such contact';
        }
  • 相关阅读:
    JZOJ.2117. 【2016-12-30普及组模拟】台风
    团队合作
    长沙游记
    统计
    html....
    OI之路
    三鑫普及组模拟赛
    牛顿迭代法
    台风
    gcd
  • 原文地址:https://www.cnblogs.com/qimeng/p/6847985.html
Copyright © 2011-2022 走看看