Javascript 如何使每个循环在第一个真实条件下停止
我正在做一个小的个人项目的登录/注册表单,我遇到了一个小小的障碍 所有新用户都存储在本地存储中。 当用户登录时,我想从本地存储中检索所有用户,并循环查看登录详细信息是否与用户注册详细信息匹配 我基本上已经创建了代码,只是无法让if/else语句正常工作。如果值为true,则返回true,但继续循环,对于不为true的值,则返回false 如何使循环在第一个真值处停止 这是我的密码:Javascript 如何使每个循环在第一个真实条件下停止,javascript,arrays,for-loop,Javascript,Arrays,For Loop,我正在做一个小的个人项目的登录/注册表单,我遇到了一个小小的障碍 所有新用户都存储在本地存储中。 当用户登录时,我想从本地存储中检索所有用户,并循环查看登录详细信息是否与用户注册详细信息匹配 我基本上已经创建了代码,只是无法让if/else语句正常工作。如果值为true,则返回true,但继续循环,对于不为true的值,则返回false 如何使循环在第一个真值处停止 这是我的密码: // gather information and loop through users array docume
// gather information and loop through users array
document.querySelector("#login").addEventListener("click", function(e)
{
// login details gathered from user
var logId = document.getElementById("logId").value;
var logPass = document.getElementById("logPass").value;
// get all the users from local stroage and loop through
var allUsers = JSON.parse(localStorage.getItem("users"));
allUsers.forEach(function(user) {
if (user.userId === logId && user.userPassword === logPass) {
console.log("true");
} else {
console.log("fasle");
}
});
// prevent form from submitting
e.preventDefault();
});
使用普通for循环而不是foreach,并使用break;要在条件为真时退出for循环,没有简单的方法使forEach短路,您可以使用这样的传统for循环
// gather information and loop through users array
document.querySelector("#login").addEventListener("click", function(e) {
// login details gathered from user
var logId = document.getElementById("logId").value;
var logPass = document.getElementById("logPass").value;
// get all the users from local stroage and loop through
var allUsers = JSON.parse(localStorage.getItem("users"));
for (var i = 0; i < allUsers.length; i++) {
if(user.userId === logId && user.userPassword === logPass){
console.log("true");
break;
} else {
console.log("false");
}
}
// prevent form from submitting
e.preventDefault();
});
forEach并不是一个真正的声明。它只是一个在其参数中调用传递函数的函数。所以,完全不可能在for语句中处理某些内容。
此时,我建议您使用for语句并从数组中选择索引:
for (let length = allUsers.length, i = 0, user = allUsers[i]; i < length; i++, user = allUsers[i]) {
//Here's user that is the same such than the parameter in your function.
}
或:
现在,您必须将函数$break与函数中的return语句相结合:
//In this example I overwrite the normal forEach function
Array.prototype.forEach = function(callback) {
window.$break = function() {
window._break = true;
};
window.$continue = function() {
window._continue = true;
};
for (let l = this.length, i = 0, e = this[i]; i < l; i++, e = this[i]) {
if (window._break) {
window._break = false;
break;
}
if (window._continue) {
window._continue = false;
continue;
}
callback(e, i);
}
};
我发布的后一个解决方案,我也写了进去。我建议使用。一些
如果用户与您的需求的任何匹配项为false,则返回true
根据MDN文档: 除了通过以下方法,没有其他方法停止或中断forEach循环 正在引发异常。如果需要这样的行为,可以使用forEach方法 这是错误的工具。使用普通循环或for…而不是。如果你是 测试数组元素的谓词并需要布尔返回 值,则可以使用每个或某些值。如有,新的 方法find或findIndex可用于在以下情况下提前终止 true谓词也是如此 或者,你也可以做的是
var currentUser = allUsers.find(function fn(user) {
return user.userId === logId && user.userPassword === logPass;
}
希望对您有所帮助。仅使用普通for或某些,foreach只调用每个元素上的传递函数,无法中断。您可以使用try-catch停止foreach,我编写了一个示例代码,您可以根据需要更改
var q = [1,2,3,4,5,6,7,8,9,10]
try
{
q.forEach(function (x){
print(x)
if (x==3)
throw "bye bye"
})
}
catch(e)
{
print(e)
}
返回有什么问题?@AyushGupta返回forEach工作,如继续,检查我的答案,soulotion是try Catch我很高兴它帮助了你。请接受答案,这样对其他人也会有帮助。
var condition = false;
allUsers.forEach(function(user) {
if (condition) {
$break();
return;
}
});
let isUserMatched = allUsers.some(function(user) {
return user.userId === logId && user.userPassword === logPass)
});
if(isUserMatched){
// do something
}
var currentUser = allUsers.find(function fn(user) {
return user.userId === logId && user.userPassword === logPass;
}
var q = [1,2,3,4,5,6,7,8,9,10]
try
{
q.forEach(function (x){
print(x)
if (x==3)
throw "bye bye"
})
}
catch(e)
{
print(e)
}