繁体   English   中英

如何比较输入和JSON数据

[英]How to compare Inputs and JSON data

我正在做一个学校项目,我需要验证一些用户而不创建真实的数据库。 我的问题是,当我将输入中输入的信息与JSON中存储的信息进行比较时,它会为每个不匹配的选项弹出一个错误。 我想要的是将多个错误减少为一个(如果用户名或密码与JSON中存储的信息不匹配)。 这是我的JavaScript:

 const form = document.querySelector('form'); form.addEventListener('submit', function(e){ e.preventDefault(); const emailInput = document.querySelector('#email').value; const pwdInput = document.querySelector('#pwd').value; const object = { email: emailInput, pwd: pwdInput }; fetch('users.json') .then(res => res.json()) .then(data => { data.forEach(function(user) { const userInfo = JSON.stringify(user); const databaseInfo = JSON.stringify(object); if(userInfo === databaseInfo) { console.log('success'); } else { console.log('err'); } }); }) .catch(error => console.log('error')); }); 

这是用JSON制作的假数据库:

     [
      {"email": "James", "pwd": "1111"},
      {"email": "Peter", "pwd": "2222"},
      {"email": "Josh", "pwd": "3333"}
     ]

使用原始JavaScript:

 // This is only to simulate your fetch from JSON function fakeFetch () { return Promise.resolve([ {"email": "James", "pwd": "1111"}, {"email": "Peter", "pwd": "2222"}, {"email": "Josh", "pwd": "3333"} ]); } const form = document.querySelector('form'); form.addEventListener( 'submit', function(e){ e.preventDefault(); const emailInput = document.querySelector('#email').value; const pwdInput = document.querySelector('#pwd').value; const object = { email: emailInput, pwd: pwdInput }; fakeFetch() .then( users => { // Check each user in users and try to find a match for ( let user of users ) { // Destructuring email and password from the current user let { email, pwd } = user; // Comparing email and pwd from active user with the ones in object if ( email === object.email && pwd === object.pwd ) { // Found, do something console.log( 'found!' ); return; } } // Not found, do something else console.log( 'Not found...' ); }) .catch(error => console.log( error ) ); }); 
 <form> <input type="text" id="email"/> <input type="test" id="pwd"/> <input type="submit"/> </form> 

我尝试在评论中进行解释,但可能更容易向您展示。 我认为最好比较可能的最小数据量(而不是大的JSON字符串),例如从电子邮件到电子邮件以及从密码到密码。

因此,我更改了您if进行更简单的比较。

要将所有错误汇总为一个,可以包含一个标志,如果找到匹配项,则将其设置为true 然后在forEach循环之外,您可以检查该标志并仅记录1个错误(如果没有匹配项)

 var users = [{ email: "user1", pwd: "pass1" }, { email: "user2", pwd: "pass2" }]; var object = { email: "user3", pwd: "pass3" }; var isMatch = false; users.forEach(function(user) { if (user.email === object.email && user.pwd === object.pwd) { console.log("success"); isMatch = true; } }); if (!isMatch) { // only logs once even though there are multiple users console.log("No Match!"); } 

函数的主要思想是给定一个元组(用户名,密码),检查它是否存在于数据库中(在这种情况下为对象数组)。 您可能会说您想从数组中过滤用户名和密码与用户插入的内容匹配的条目。 由于应该没有重复的用户名/密码元组,因此您的过滤器应返回匹配的元组或为null。

为此,可以采用以下方法:

 function verifyLogin(loginObject) { return new Promise((resolve, reject) => { fetch('users.json') .then(res => res.json()) .then(data => data.filter(entry => entry.email === loginObject.email && loginObject.pwd === object.pwd).length > 0 ? resolve(true) : resolve(false)) .catch(error => reject(error)); }); }) } verifyLogin(loginObject) .then(result => result === true ? console.log('Login successful!') : console.log('Login failed')) .catch(error => console.log(error)) 

这样,代码可以显示您要完成的工作,并且没有副作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM