函数编程难题求助:查找指定用户的好友所属客户姓名列表
问题描述
现有一个包含客户对象的数组,每个客户对象包含friends数组,每个好友对象有name等属性。需求是:给定该数组和一个客户姓名,编写函数判断该客户是否在其他客户的好友列表中,若是则返回这些客户的姓名数组。
示例:客户"Olga Newton"存在于Regina和Jay的好友列表中,预期返回['Regina', 'Jay']。
尝试使用filter函数处理,但因friends是嵌套对象数组,未能成功——返回结果要么是完整客户对象数组,要么是空数组,求问问题出在哪里?
附客户数组代码:
var customers = [{ name: "Olga Newton", age: 43, balance: "$3,400", friends: [{ id: 0, name: "Justice Lara" }, { id: 1, name: "Duke Patrick" }, { id: 2, name: "Herring Hull" }, { id: 3, name: "Johnnie Berg" }] }, { name: "Regina", age: 53, balance: "$4,000", friends: [{ id: 0, name: "Cheryl Kent" }, { id: 1, name: "Cynthia Wells" }, { id: 2, name: "Gutierrez Waters" }, { id: 3, name: "Olga Newton" }] }, { name: "Jay", age: 28, balance: "$3,000", friends: [{ id: 0, name: "Cross Barnett" }, { id: 1, name: "Raquel Haney" }, { id: 2, name: "Olga Newton" }, { id: 3, name: "Shelly Walton" }] }];
问题原因与解决方法
问题出在哪?
你用filter没成功的核心问题是:没正确处理嵌套的friends数组判断。要么直接把customer.friends当作判断条件(数组在布尔逻辑里是真,所以返回所有客户),要么错误地直接访问customer.friends.name——friends是数组,根本没有name属性,所以返回空数组。
怎么解决?
要实现需求,得把filter和some(或find)结合起来用:
- 先用
filter遍历客户数组,只留下好友列表里有目标姓名的客户; - 对每个客户的
friends数组,用some判断有没有好友的name和目标姓名匹配(some找到第一个匹配项就停,效率更高); - 最后用
map把筛选出的客户对象转成姓名数组。
完整代码
function findCustomersWhoHaveFriend(customers, targetName) { return customers .filter(customer => { // 排除目标客户自己(不需要排除可删除此行) if (customer.name === targetName) return false; // 判断当前客户的好友列表是否包含目标姓名 return customer.friends.some(friend => friend.name === targetName); }) .map(customer => customer.name); // 提取客户姓名 } // 测试示例 console.log(findCustomersWhoHaveFriend(customers, "Olga Newton")); // 输出: ['Regina', 'Jay']
补充说明
- 如果允许客户自己出现在自己的好友列表中,删掉
filter里的if (customer.name === targetName) return false;即可; - 也可以用
find替代some,但some更适合做存在性判断,找到匹配项后立即停止遍历,性能更优。
内容的提问来源于stack exchange,提问作者GloriousKaboom
相关产品推荐
相关产品推荐

