如果从构造函数实例创建的数组元素之一没有相同的电子邮件,则我试图创建构造函数的实例。
let users = [];
class User{
constructor(email, name, age, lang){
this.email = email;
this.name = name;
this.age = age;
this.lang = lang
}
save(){
users.push(this)
}
}
function validate(email, name, age, lang){
let uEmail = email;
users.forEach(ele =>{
if(ele.email == email){
console.log('You have account with us')
}else if(!ele.email){
creatObj(uEmail, name, age, lang)
}
})
}
function creatObj(email,name, age, lang){
new User('s@s.com',name, age, lang).save()
}
当我使用相同的电子邮件运行代码时,不需要将实例推送到users数组。
不幸的是,即使不满足条件,它也会继续推送实例。
有人可以帮忙吗?
答案 0 :(得分:1)
最好通过键(例如小写的电子邮件地址)使用查找。并使用适当的数据结构(例如对象,地图,集合)以确保您不必搜索整个数组。
代码的最低修改版本:
const usersByEmail = {};
class User{
constructor(email, name, age, lang){
this.email = email;
this.name = name;
this.age = age;
this.lang = lang
}
save(){
usersByEmail[this.email.toLowerCase()] = this;
}
}
function getOrCreateUser(email, name, age, lang){
if (email.toLowerCase() in usersByEmail) {
console.log('You have account with us');
} else {
new User(email ,name, age, lang).save();
}
return usersByEmail[email.toLowerCase()];
}
getOrCreateUser('s@s.com', 'sam', 32, 'en');
getOrCreateUser('s@s.com', 'samuel', 23, 'es');
getOrCreateUser('a@b.com', 'other guy', 44, 'en');
getOrCreateUser('s@s.com', 'sam', 32, 'en');
console.warn('as object...');
console.log(usersByEmail);
console.warn('as array...');
console.log(Object.values(usersByEmail));