Массив объектов сравнивает значения 2 элементов

#javascript #reactjs #react-redux

#javascript #reactjs #реагировать-redux

Вопрос:

Я пытаюсь выполнить проверку поля, и я застрял в случае сравнения значений 2 элементов в одном и том же массиве объектов. Может кто-нибудь объяснить мне, как обычно это делается? Я хочу, чтобы значения password и repPassword сравнивались за одну итерацию.

 export const fieldsConfig = [
  {
    id: "email",
    label: "email",
    value: "",
    error: false,
    helperText: "email must includes chars: @ and .",
  },
  {
    id: "userName",
    label: "user name",
    value: "",
    error: false,
    helperText: "user name must be min 5 char",
  },
  {
    id: "password",
    label: "password",
    value: "",
    error: false,
    helperText: "password must be min 5 chars",
  },
  {
    id: "repPassword",
    label: "rep-password",
    value: "",
    error: false,
    helperText: "passwords not mutch",
  },
];
 

Вот мое состояние redux, в котором я пытаюсь проверить значение полей и выполнить проверку для каждого из них:

 case FIELDSVALIDATION:
      const validationFields = [...state.fields].map((element, index, arr) => ({
        id: element.id,
        label: element.label,
        value: element.value,
        error:
          element.id === "email" amp;amp;
          !/(. )@(. ){2,}.(. ){2,}/.test(element.value)
            ? (element.error = true)
            : element.value.length < 5
            ? (element.error = true)
            : (element.error = false),
        helperText: element.helperText,
      }));
      return {
        ...state,
        fields: validationFields,
      }
 

Я использую форму поля ввода из пользовательского интерфейса material. Вот часть компонента и то, как я его реализую:

 const state = useSelector((state) => state.regReducer);
  const dispatch = useDispatch();
  
  return (
    <div className="registration">
      {state.fields.map((element, key) => {
        return (
          <TextField
            key={key}
            id={element.id}
            label={element.label}
            value={element.value}
            error={element.error}
            helperText={element.error ? element.helperText : ""}
            onChange={(e) =>
              dispatch(onChangeHandler(e.target.id, e.target.value))
            }
          />
        );
      })}
 

Ответ №1:

Вы можете попробовать добавить пользовательскую функцию, которая ищет поля в состоянии и сравнивает их текущее значение:

    <div className="registration">
      {state.fields.map((element, key) => {
        const generateError = () => {
          if (element.id.includes("password")) {
            const password = state.fields.find(el => el.id == "password");
            const repPassword = state.fields.find(el => el.id == "repPassword");

            if (password.value != repPassword.value) {
              return true;
            } else {
              return false;
            }
          } else return element.error;
        };

        return (
          <TextField
            key={key}
            id={element.id}
            label={element.label}
            value={element.value}
            error={generateError}
            helperText={element.error ? element.helperText : ""}
            onChange={e =>
              dispatch(onChangeHandler(e.target.id, e.target.value))
            }
          />
        );
      })}
    </div>
 

Комментарии:

1. спасибо за ваши отзывы, но я уже пробовал это, прежде чем создавать этот вопрос, я хочу сделать это за одну итерацию, если это возможно