2016-07-12 1 views
0

У меня есть массив объектов пользователей, каждый из которых имеет «имя пользователя» и «пароль».Как проверить каждый объект в массиве в ReactJS + Redux?

Существует страница входа в систему, где, когда пользователь вводит имя пользователя и пароль, я хочу передать это в редуктор и сравнить их с каждым объектом в массиве «users», а если объект, который соответствует оба, «пароль» и «имя пользователя», я хочу, чтобы он возвращал «true».

Ниже редуктор:

const usersReducer = function(users = [], action){ 
    switch (action.type){ 

    case 'VERIFY_USER': 
     return users.map((user)=> { 
      if(user.username === action.username && user.password === action.password){ 
      return true 
      } else{ 
      return false 
      } 
     }) 
     } 

    default: 
     return users 
    } 
} 

Но это, кажется, возвращает истину все время. Правильно ли я использую карту? Если нет, существует ли такой метод, когда он будет проходить через каждый объект в массиве? Будет оценено любое понимание или руководство. Заранее спасибо!

EDIT ** Назвав его из следующих функций:

verifyLoginUser(){ 
    event.preventDefault() 

    if(this.props.actions.verifyUser(this.props.loginUser.username, this.props.loginUser.password)){ 
     console.log('LOGGED IN') 
    } else { 
     console.log('NOT LOGGED IN') 
    } 
    } 

Со следующим редуктором:

case 'VERIFY_USER': 
    let isVerified = false; 
    users.forEach((user)=> { 
    if(user.username === action.username && user.password === action.password){ 
     isVerified = true; 
     return false; 
    } 
    }); 
    return isVerified; 
+0

[Array.find] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find) – Hamms

+0

надеюсь, это просто то, что вы создавая для удовольствия и фактически не выпуская, как хранение + проверка паролей так, как вы это делаете, примерно такая же неуверенность, как вы можете получить – Hamms

+0

@ Хаммс еще не подключен к безопасному бэкенду. это просто для тестирования и обучения. оцените заботу! –

ответ

1

Использование Array.some

return users.some(user => user.username === action.username && user.password === action.password); 
+0

они хотят на самом деле получить соответствующего пользователя – Hamms

+0

@Hamms Он/она сказал: «Я хочу, чтобы он вернулся« правда »., Так что это будет хорошо для него/нее. – Chalk

0

функция Map вернет вам массив. Я предлагаю использовать другую функцию собственного массива: «найти». Для того, чтобы проверить, существует ли объект пользователя в массиве пользователей, вы можете сделать

function findUser(user) { 
    return (user.username === action.username && user.password === action.password); 
} 

var isUser = users.find(findUser) ? true : false; 
return isUser; 
0

Используйте булеву переменную и Foreach выполнить то, что вы хотите

case 'VERIFY_USER': 
    let isVerified = false; 
    users.forEach((user)=> { 
     if(user.username === action.username && user.password === action.password){ 
      isVerified = true; 
      return false; 
     } 
    }); 
    return isVerified; 

принять это шаг вперед, вы хотели итерации по этому вопросу и возвращения правильного пользователя таким образом, чтобы вы могли заполнить currentUser им или что-то в этом роде.

case 'VERIFY_USER': 
    let currentUser = null; 
    users.forEach((user)=> { 
     if(user.username === action.username && user.password === action.password){ 
      currentUser = user; 
      return false; 
     } 
    }); 
    return currentUser; 

EDIT: к тому, что мы говорили о том, в комментариях

позволяет сказать, что вы делаете запрос на логин пользователя куда-нибудь. и функция живет на вашем реквизит

this.props.loginUser({my params here}); 

теперь ваши фактических действия.

loginUser = (data) => { 
    // whatever method you are using to make the request goes here. 
    someRequestMethod('/login/, data).then((response) => { 
     if(response.status === 200){ 
      dispatch(type: USER_LOGIN, payload: response.data); // whatever the user is that comes back from the response. I just put data for an example 
     } 
    }) 
} 

теперь в вашем редукторе

const populateState = (user) => { 
    return { 
     id: user.id, 
     username: user.username, 
     email: user.email, 
     isAuthenticated: Object.keys(user).length > 0 
    }; 
} 
let defaultState = {id: null, username: '', email: '', isAuthenticated: false}; 
const loginReducer = (currentUser = defaultState) => { 
    switch (action.type){ 
     case 'USER_LOGIN': 
      return Object.assign({}, currentUser, populateState(action.payload)); 
    return currentUser; 
} 

наконец, везде вы только посмотрите для текущего пользователя.

if(this.props.currentUser.isAuthenticated){ 
    // do stuff 
} 
+0

Извините, но почему это возвращает false внутри if-statement. –

+0

@JoKo Возврат false - это просто разрыв цикла forEach. вы возвращаетесь (к сокращению) isVerified, который установлен в true, когда у вас есть правильное значение. (forEach по умолчанию возвращает true так, что следующая итерация цикла for произойдет. Я вырвался из этого цикла, потому что мы уже нашли правильного человека). –

+0

Цените пояснения, но все еще, похоже, не работают должным образом. Можно ли открыть чат? Было бы очень приятно. Застрял на этом со вчерашнего дня. –

 Смежные вопросы

  • Нет связанных вопросов^_^