如何比较输入和JSON数据

时间:2018-09-10 18:26:41

标签: javascript arrays json error-suppression

我正在做一个学校项目,我需要验证一些用户而不建立真实的数据库。我的问题是,当我将输入中输入的信息与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"}
     ]

3 个答案:

答案 0 :(得分:1)

使用原始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>

答案 1 :(得分:0)

我尝试在评论中进行解释,但可能更容易向您展示。我认为最好比较可能的最小数据量(而不是大的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!");
}

答案 2 :(得分:0)

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

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