如何比较输入和 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!");
}

你的函数的主要思想是,给定一个元组(用户名,密码),检查它是否存在于你的数据库中,在本例中是一个对象数组。 你可以说你想从数组中过滤出用户名和密码与用户输入的匹配的条目。由于不应该有 username/password 的重复元组,您的过滤器应该 return 匹配的元组或 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))

通过这种方式,代码可以显示您要完成的工作并且没有副作用。