数组存在目标用户数据但判断函数返回false问题求解
问题场景
从API接口获取到用户列表数组,示例数据结构如下:
const users = [ { "email": "test123@gmail.com", "name": "test user", "uid": "1612848114665355196015101548881161" }, { "email": "test123@gmail.com", "name": "test user", "uid": "1612848114665355196015101548881161" } ]
业务需求:判断邮箱为test123@gmail.com的用户是否在数组中,不存在则调用接口创建新用户。原有实现通过遍历数组做校验,预期匹配到用户返回true,未匹配返回false,但实际即使数组中存在目标用户,函数始终返回false。
原有问题代码:
const checkIfUserThere = async () => { let newUser = "test123@gmail.com"; await users.map((user: any) => { if (user.email === newUser) { return true; } }); return false; }; useEffect(() => { (async () => { const userExists = await checkIfUserThere(); console.log(userExists); if(userExists === false){ createuserapi("....") // 调用创建用户接口 } })(); }, [users]);
问题根因
Array.map是同步方法,返回值是由每轮回调返回值组成的新数组,本身不是Promise,对它使用await没有任何实际效果,不会阻塞或拿到你想要的判断结果。- 返回值作用域错误:
map回调内部的return true仅作用于回调函数本身,只会把true塞入map生成的结果数组,不会作为外层checkIfUserThere函数的返回值跳出。map遍历完成后代码会直接执行到函数最后一行,固定返回false,这就是无论是否匹配到用户结果永远为false的核心原因。 - 冗余写法:整个用户存在性判断逻辑全是同步操作,没有任何异步等待的逻辑,不需要给函数加
async标记。
正确实现
优先使用数组原生的some方法,该方法专门用于检测数组中是否存在符合条件的元素,找到匹配项会立刻终止遍历返回true,全量遍历后无匹配则返回false,完全匹配当前业务场景:
const checkIfUserThere = () => { const targetEmail = "test123@gmail.com"; // 只要有一个用户邮箱匹配,就返回true return users.some((user) => user.email === targetEmail); }; useEffect(() => { const userExists = checkIfUserThere(); console.log(userExists); if (!userExists) { createuserapi("....") // 调用创建用户接口 } }, [users]);
如果习惯手动写遍历逻辑,也可以用for...of循环实现,注意匹配到之后直接在外层函数return即可:
const checkIfUserThere = () => { const targetEmail = "test123@gmail.com"; for (const user of users) { if (user.email === targetEmail) { return true; } } return false; };
内容的提问来源于stack exchange,提问作者Sai Krishnadas
相关产品推荐
相关产品推荐

