Javascript 函数仅检查数组中的最后一项

Javascript 函数仅检查数组中的最后一项,javascript,reactjs,Javascript,Reactjs,我有一个功能,我验证用户提交的电子邮件。我通过将用户电子邮件与每个有效的电子邮件域进行比较来做到这一点。我将用户提交的电子邮件存储在一个数组中,并将有效的电子邮件域也存储在一个数组中。问题是,当使用函数时,它只检查用户数组中的最后一个值是否有效,而不检查它前面的元素 我的职能: handelTeamError = () => { var array = []; //user emails get put in here var emailcheck = EmailDome

我有一个功能,我验证用户提交的电子邮件。我通过将用户电子邮件与每个有效的电子邮件域进行比较来做到这一点。我将用户提交的电子邮件存储在一个数组中,并将有效的电子邮件域也存储在一个数组中。问题是,当使用函数时,它只检查用户数组中的最后一个值是否有效,而不检查它前面的元素

我的职能:

handelTeamError = () => {
    var array = []; //user emails get put in here 
    var emailcheck = EmailDomeinen(); //array with valid email domains
    const emailrow = this.state.rows.map(x => array.push(x.email)); //every email that user submitted

    //if user submitted nothing function will return false; user can't continue
    if(!emailrow){
        this.setState(() => ({tlemailError: true}));
        return false;
    }else{
        for(let i = 0; i < emailcheck.length; i++){
            let email = emailcheck[i]; //get all the valid emails
            for(let j = 0; j < array.length; j++){
                let res = array[j].split("@", 1).toString(); //checks if user typed more than only the email domain
                if(!array[j].endsWith("@" + email)){ //if the user value ends with @ and a valid email domains
                    this.state.rows.map( x => x.tlEmailError = true); //error state = true
                }else{
                    if(res){
                        this.state.rows.map( x => x.tlEmailError = false); //error state = false
                        return true; // user can continue 
                    }
                }
            }
        }
        return false;
    }
};
handeltameror=()=>{
var array=[];//用户电子邮件放在这里
var emailcheck=EmailDomeinen();//包含有效电子邮件域的数组
const emailrow=this.state.rows.map(x=>array.push(x.email));//用户提交的每封电子邮件
//如果用户未提交任何内容,函数将返回false;用户无法继续
如果(!emailrow){
this.setState(()=>({tlemailError:true}));
返回false;
}否则{
for(设i=0;ix.tlEmailError=true);//错误状态=true
}否则{
如果(res){
this.state.rows.map(x=>x.tlEmailError=false);//错误状态=false
返回true;//用户可以继续
}
}
}
}
返回false;
}
};

旁白:由于您一直在使用
map
,因此可以使用另外两种JS数组方法来减少代码占用:以及:

const state=[{name:'bob',email:'bob@gmail.com{name:'dan',电子邮件:'dan@yahoo.com'},{name:'tree',电子邮件:'tree@tree.com“},{姓名:'pete',电子邮件:'pete@aol.com'}];
const emailCheck=['aol.com','gmail.com'];
常量数组=state.reduce((arr,cur)=>{
const domain=cur.email.split('@')[1];
emailCheck.includes(域)?cur.emailError=true:cur.emailError=false;
返回当前到达时间(当前);
}, []);

console.log(数组)我发现您的方法存在一些问题

首先,
emailrow
看起来总是一个数组(空或满),所以
if(!emailrow){
将始终返回
false
。您应该使用
if(!emailrow.length){

然后,您的算法似乎在检查每个用户电子邮件是否以所有有效域结尾,这是可以理解的。您的外部循环应该是用户电子邮件,您的内部循环应该尝试查找是否有一个有效域与之匹配

最后,您似乎试图直接修改
this.state.rows
中的状态,而不是使用
setState
函数,这是正确的方法

因此,重构版本可能是

//这假设您的状态中有一个sigle-tlEmailError属性
//而不是每封邮件一封
handeltameror=()=>{
const validDomains=EmailDomeinen();//包含有效电子邮件域的数组
const userEmails=this.state.rows.map(row=>row.email);//用户提交的每封电子邮件
//检查所有电子邮件是否有效
const allValid=userEmails.every(email=>{
const isValid=email.indexOf('@')>0,
userDomain=email.split('@')[1];
返回(isValid&&validDomains.some(domain=>domain==userDomain));
});
const result=userEmails.length&&allValid;
这是我的国家({
错误:结果
});
返回结果;

}
const-emailrow=this.state.rows.map(x=>array.push(x.email))
看起来可疑。只需执行
const-array=this.state.rows.map(x=>x.email)即可;
将返回一系列电子邮件。状态与检查功能无关。该状态仅存在于此,以便程序知道它必须添加某种样式。@baklazan
返回true;//用户可以继续
-当它第一次到达这一行时,您的循环和整个函数都已结束-确定这就是您想要的想要吗?顺便说一句,我可能会改变这些循环的顺序-现在你正在为你检查的每个域的每个电子邮件地址在@处进行拆分,而如果你以另一种方式进行拆分-在用户输入的电子邮件地址上进行循环,在有效域上进行内部循环,你只需进行一次拆分er地址。可能是微优化,但仍然…您是否对每封电子邮件都有
tlEmailError
?或者它是您所在州的通用属性?