数据库匹配时find方法输出一真一假,如何仅输出true?
问题:find方法为何输出两次结果,如何只输出true?
你遇到的问题核心在于遍历逻辑搞反了,而且用错了数组方法,咱们一步步拆解:
为什么会输出true和false?
看你的代码:
services.getDataUsers(res => res.map(e => { // database const find = newUser.find(elem => elem.login === e.user.login && elem.password === e.user.password); console.log(!!find) // true & false // ...其他逻辑 return false; }));
这里的res是你的数据库(包含2个元素),你用map遍历了数据库里的每一个元素——也就是说,数据库有2个元素,这个回调就会执行2次:
- 第一次遍历到匹配的用户,
newUser.find找到了对应元素,!!find输出true - 第二次遍历到不匹配的用户,
newUser.find没找到,!!find输出false
而且newUser本身是只有一个元素的数组,用find去查它完全没必要,逻辑完全搞反了:应该是用数据库数组去查找是否存在和newUser匹配的元素,而不是反过来遍历数据库每个元素去查newUser。
另外,map方法是用来转换数组的(返回一个新数组),你这里根本不需要转换数组,只是要查找匹配项,用map属于误用,它会强制遍历完所有元素,哪怕已经找到了匹配项。
如何修改成只输出true?
咱们调整逻辑:
- 先从
newUser里取出唯一的用户对象(因为它只有一个元素,直接用newUser[0]就行,没必要用数组存) - 用数据库数组的
find方法直接查找匹配项,找到就停止遍历,不会执行多余的循环 - 去掉没必要的
map,改用find或者some(如果只需要判断是否存在,some更高效)
修改后的代码示例:
const userSignInFunc = (user, services) => dispatch => { // 直接取出用户信息,不用包成数组 const targetUser = { login: user.login.value, password: user.password.value }; services.getDataUsers(res => { // 用数据库数组find匹配项,找到就停止 const matchedUser = res.find(e => e.user.login === targetUser.login && e.user.password === targetUser.password ); console.log(!!matchedUser); // 只会输出一次:找到就是true,没找到就是false if (matchedUser) { dispatch(userSignin(matchedUser.id)); } else { dispatch(userSignInError(true)); } }); };
如果只需要判断是否存在(不需要拿到匹配的用户对象),用some会更轻量,因为some找到匹配项就立即返回true,不会继续遍历:
const isMatched = res.some(e => e.user.login === targetUser.login && e.user.password === targetUser.password ); console.log(isMatched); // 同样只输出一次
这样调整后,不管数据库有多少元素,只要找到匹配项就停止,只会输出一次结果,符合你想要的只输出true的需求(当存在匹配用户时)。
内容的提问来源于stack exchange,提问作者user12919356
相关产品推荐
相关产品推荐

