为什么打印日志时用户对象的firstName是布尔值而非实际用户名
问题原因
- 核心问题是你实际运行的代码中,
Array.find()的回调函数内错误将比较运算符===写成了赋值运算符=,或是误将ID匹配的判断结果直接赋值给了firstName属性:- 每次遍历用户对象时,你都直接修改了原
users数组中对应对象的firstName属性,赋值为「当前用户ID和目标评论用户ID是否相等」的布尔值 - 赋值表达式的返回值就是被赋的值,当遍历到ID匹配的用户时,赋值结果为
true,find方法会认为匹配成功返回该用户,最终就出现了返回用户的firstName为布尔值、其余用户firstName被篡改的情况。
- 每次遍历用户对象时,你都直接修改了原
- 你问题中贴出的代码本身是可以正常运行得到正确结果的,和你描述的输出不符,说明你实际运行的代码存在上述赋值错误。
修复方案
- 优先推荐拆分查询逻辑,代码可读性更高,也更容易避免写错运算符:
// 第一步:先根据评论内容找到对应评论 const targetComment = comments.find(comment => comment.text === "Cool, thanks!"); // 第二步:根据评论绑定的userId找到对应用户 const targetUser = users.find(user => user.id === targetComment?.userId); console.log(targetUser); // 正确输出:{id: 'b4a306cb-8b95-4f85-b9f8-434dbe010985', firstName: 'Some string', lastName: 'Marshall'}
- 如果不需要复用评论对象,也可以保留合并写法,注意不要写错运算符即可:
const targetUser = users.find(user => user.id === comments.find(comment => comment.text === "Cool, thanks!")?.userId);
- 优化方案:如果需要多次查询用户,建议提前将用户数组转为ID为键的Map,大幅提升查询效率:
const userMap = new Map(users.map(user => [user.id, user])); const targetComment = comments.find(comment => comment.text === "Cool, thanks!"); const targetUser = userMap.get(targetComment?.userId);
内容的提问来源于stack exchange,提问作者Barry Allen
相关产品推荐
相关产品推荐

