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

时间:2018-01-20 10:27:26

标签: javascript arrays for-loop

我作为一个小型个人项目进行登录/注册表单,我遇到了轻微的障碍。

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

我基本上已经创建了代码,我只是无法让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();
});

7 个答案:

答案 0 :(得分:2)

我建议使用.somehttps://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)
    }