Javascript 如何使每个循环在第一个真实条件下停止

Javascript 如何使每个循环在第一个真实条件下停止,javascript,arrays,for-loop,Javascript,Arrays,For Loop,我正在做一个小的个人项目的登录/注册表单,我遇到了一个小小的障碍 所有新用户都存储在本地存储中。 当用户登录时,我想从本地存储中检索所有用户,并循环查看登录详细信息是否与用户注册详细信息匹配 我基本上已经创建了代码,只是无法让if/else语句正常工作。如果值为true,则返回true,但继续循环,对于不为true的值,则返回false 如何使循环在第一个真值处停止 这是我的密码: // gather information and loop through users array docume

我正在做一个小的个人项目的登录/注册表单,我遇到了一个小小的障碍

所有新用户都存储在本地存储中。 当用户登录时,我想从本地存储中检索所有用户,并循环查看登录详细信息是否与用户注册详细信息匹配

我基本上已经创建了代码,只是无法让if/else语句正常工作。如果值为true,则返回true,但继续循环,对于不为true的值,则返回false

如何使循环在第一个真值处停止

这是我的密码:

// 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)
    }