3

there are an array and var I created:

var database = [
    {
        username:"candy",
        password:"666"
    },
    {
        username: "abby",
        password: "123"
    },
    {
        username: "bob",
        password: "777"
    }
];

var newsFeed = [
    {
        username: "Bob",
        timeline: "So tired from all that learning!"
    },
    {
        username: "Midori",
        timeline: "Javascript is sooooo cool!"
    },
    {
        username: "Abby",
        timeline: "Javascript is preeetyy cool!"
    }
]

var usernamePrompt = prompt("What\'s your username?");
var passwordPrompt = prompt("What\'s your password?");

and I want to use forEach to go through all array value from var database and then check them whether true or false here is rest of the code:

database.forEach(checkDatabase2);//using forEach

function checkDatabase2(username,password) {
    if (username === database.username && password === database.password){
        return true;
    }
return false;

and finally to check if it's true then print newsFeed, eles it will have alert, here is what I do:

function signIn(username,password) {
    if (checkDatabase2(username,password)===true){
            console.log(newsFeed); 
    }else{
        alert("Opps! Worng Password!");
    }
}
signIn(usernamePrompt,passwordPrompt);

But when I enter the value whatever I put, it always comes to alert("Opps! Worng Password!"); How I can fix it when I put the correct value from database =[], it will return true??

Jamie Wang
  • 63
  • 1
  • 1
  • 5
  • Callback function of `.forEach()` will always return `undefined` so don't expect any Boolean unless the function mutates or modifies a preexisting array declared outside of function. – zer00ne Jul 18 '19 at 04:01

5 Answers5

9

One option you have is to use some to check if atleast one element of array element is the username and password

var database = [{"username":"candy","password":"666"},{"username":"abby","password":"123"},{"username":"bob","password":"777"}];

function checkDatabase2(username, password) {
  return database.some(o => o.username == username && o.password == password);
}

console.log(checkDatabase2("bob", "777"));
console.log(checkDatabase2("bob", "NOT777"));
Eddie
  • 26,593
  • 6
  • 36
  • 58
1

Don't use forEach, use some.

function validate (username, password) {
  return database.some(function(item) {
    return (item.username === username && item.password === password);
  });
}

function checkDatabase2 (username, password) {
   if (validate(username, password)) {
     return true;
   }
   return false;
}
Dark Horse
  • 111
  • 1
  • 4
0

Don't use forEach(), use some().

You also have to put the loop inside the checkDatabase2() function, not call it in a loop.

function checkDatabase2(username, password) {
    return database.some(user => user.username == username && user.password = password);
}
Barmar
  • 741,623
  • 53
  • 500
  • 612
0

You can use find instead of forEach like below


var database = [
  {
    username: "candy",
    password: "666"
  },
  {
    username: "abby",
    password: "123"
  },
  {
    username: "bob",
    password: "777"
  }
];

var newsFeed = [
  {
    username: "bob",
    timeline: "So tired from all that learning!"
  },
  {
    username: "midori",
    timeline: "Javascript is sooooo cool!"
  },
  {
    username: "abby",
    timeline: "Javascript is preeetyy cool!"
  }
];

function checkDatabase2(username, password) {
  return database.find(
    item => item.username === username && item.password === password
  );

}

function signIn(username,password) {
  if (checkDatabase2(username,password)){
          console.log(newsFeed); 
  }else{
      alert("Opps! Worng Password!");
  }
}

var usernamePrompt = prompt("What\'s your username?");
var passwordPrompt = prompt("What\'s your password?");


signIn(usernamePrompt, passwordPrompt);
rodrigouz
  • 21
  • 5
0

I think forEach() is not the best way to do this, u can try filter(), or u can try some(),

since there is alot of some() example above, ill provide filter() exampe here

ronydavid
  • 391
  • 1
  • 2
  • 11