首页 > 代码库 > FreeCodeCamp:Profile Lookup
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‘; } } }
按提交后显示了错误。之后拿去打了个断点发现存在两个问题。
Q1: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‘]
Q2:for循环执行一次整个函数就返回。还未遍历到想要查找的联系人就已经退出了。必须该返回的时候返回,不该返回的时候继续往下执行。如果要用for循环也只能在循环里设置一个return出口。
思路是先找出符合firstName的一个组。后判断这个组里是否有prop属性。如果有则返回。
function lookup(firstName,prop){ var result=contacts.filter(function(item){ return item.firstName==firstName; }); if(flag.length){ //符合的结果组只有一个 return result[0][prop]?result[0][prop]:‘no such property‘ } return ‘no such contact‘; }
FreeCodeCamp:Profile Lookup