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';
    }
原文地址:https://www.cnblogs.com/qimeng/p/6847985.html