我作为一个小型个人项目进行登录/注册表单,我遇到了轻微的障碍。
所有新用户都存储在本地存储中 当用户登录时,我想从本地存储中检索所有用户并循环访问它们,以查看登录详细信息是否与用户注册详细信息相匹配。
我基本上已经创建了代码,我只是无法让if/else
语句正常工作。如果值为true
,则会返回true
,但会继续循环播放,并为那些不是false
的内容返回true
。
如何让循环停在第一个true
值?
这是我的代码:
// 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();
});
答案 0 :(得分:2)
我建议使用.some
。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some
如果用户的任何内容符合您的要求,则会返回true
false
let isUserMatched = allUsers.some(function(user) {
return user.userId === logId && user.userPassword === logPass)
});
if(isUserMatched){
// do something
}
答案 1 :(得分:1)
没有简单的方法来短路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();
});
答案 2 :(得分:1)
根据MDN文件:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
除了by之外,没有办法停止或中断forEach()循环 抛出一个例外。如果需要这样的行为,请使用forEach()方法 是错误的工具。使用普通循环或替代。如果你是 测试数组元素的谓词并需要布尔返回 值,您可以使用every()或some()代替。如果可用,新的 方法find()或findIndex()可用于提前终止 也是真实的谓词。
或者,你也可能做的是
var currentUser = allUsers.find(function fn(user) {
return user.userId === logId && user.userPassword === logPass;
}
希望有所帮助
答案 3 :(得分:0)
使用普通for循环(不是foreach)并使用break;当条件为真时退出for循环
答案 4 :(得分:0)
forEach
实际上不是一个声明。只是function
调用其参数中传递的function
。因此,在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.
}
现在您可以添加“直到”的条件链接。让我们考虑变量condition
:
var condition = false;
for (let length = allUsers.length, i = 0, user = allUsers[i]; i < length && !condition; i++, user = allUsers[i]) {
//When condition is true, the condition of the for statement gets false and the for cycle stops.
}
或者:
var condition = false;
for (let length = allUsers.length, i = 0, user = allUsers[i]; i < length; i++, user = allUsers[i]) {
if (condition)
break;
//When condition is true, the above if statement is passed and for cycle is breaked.
}
您还可以创建自己的forEach
功能:
//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);
}
};
现在你必须将$break()
函数与return
中的function
语句结合起来:
var condition = false;
allUsers.forEach(function(user) {
if (condition) {
$break();
return;
}
});
我发布的后一个解决方案,我也写在this fiddle。
答案 5 :(得分:0)
只需使用正常的 (或一些),foreach只是调用每个元素上的传递函数,无法中断。
答案 6 :(得分:0)
你可以使用try - catch来停止每个,我写一个示例代码,你可以根据需要改变
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)
}