Как проверить, что значение уже находится в массиве проверки объекта Да

Привет, я снова с Ага и сомневаюсь

Мне нужно проверить массив полей Fromik, используя Yup. Мои поля похожи на

[{startdate:'',endDate:'',name:''},{startdate:'',endDate:'',name:''}]

Даты начала / окончания - это объект даты. Перед использованием Yup и formik я выполнял проверку, чтобы проверить, что выбранная дата уже выходит, как это

 const checkDate=(selectedDate)=>{
    const isExisting = datas
      .filter((data) => data.startDate !== null || data.endDate !== null)
      .some(
        (data) =>
          new Date(data.startDate).toLocaleDateString() === selectedDate ||
          new Date(data.endDate).toLocaleDateString() === selectedDate,
      );

    if (isExisting) {
      toast.error('Date already exits');
      return false;
    }
}

Я знаю это немного странное. У некоторых из вас может быть лучший вариант для этого. Я выполнял все проверки форм вручную, как это, После использования formik и Yup очень помогли.

Подойдя к вопросу, мне нужно проверить дату, если пользователь выбрал какую-либо, Проверить, если выбранная дата выходит или нет в массиве. Его массив полей formik Моя схема проверки похожа на

export const CheckoutSchema = Yup.object().shape({
  Checkout: Yup.array()
    .of(
      Yup.object().shape({
        name: Yup.string().required(),
        startDate: Yup.date().required(),
        endDate: Yup.date().required(),
      }),
    )
});

Я проверил несколько страниц git и переполнение стека, но не знаю, сработает ли он в моем случае здесь


person Dev    schedule 12.04.2020    source источник


Ответы (1)


У меня была аналогичная проблема, и я нашел связанный ответ полезным, но нет объяснения того, как он работает. Я смог понять это, поэтому, надеюсь, это более полезно.

Yup.addMethod(Yup.array, "unique", function(message) {
  return this.test("unique", message, function(list) {
    const mapper = x => x.name;
    const set = [...new Set(list.map(mapper))];
    const isUnique = list.length === set.length;
    if (isUnique) {
      return true;
    }

    const idx = list.findIndex((l, i) => mapper(l) !== set[i]);
    return this.createError({
      path: `[${idx}].name`,
      message: message,
    });
  });
});

const MySchema = Yup.object().shape({
  Checkout: Yup.array()
    .of(
      Yup.object().shape({
        name: Yup.string().required("Required"),
      })
    )
    .unique("Must be unique"),
});

Изменить: это фактически создаст сообщение об ошибке в конкретном поле, которое я считаю более удобным для пользователя. Кроме того, это только проверка на уникальность поля имени и предполагает, что имя поля в formik равно ${index}.name.


Поскольку я не проверял вышеизложенное, вот мой фактический код с вложенными объектами в массиве. Я проверил и подтвердил, что действительно работает.

Yup.addMethod(Yup.array, "unique", function(message, path) {
  return this.test("unique", message, function(list) {
    const mapper = x => x.description && x.description.number;
    const set = [...new Set(list.map(mapper))];
    const isUnique = list.length === set.length;
    if (isUnique) {
      return true;
    }

    const idx = list.findIndex((l, i) => mapper(l) !== set[i]);
    return this.createError({
      path: `tests[${idx}].description`,
      message: message,
    });
  });
});

const TestSchema = Yup.object().shape({
  tests: Yup.array()
    .of(
      Yup.object().shape({
        description: Yup.object().required("Required"),
      })
    )
    .unique("Test already added above"),
});
person Sharud    schedule 30.04.2020
comment
что это в this.test - person Phil; 26.04.2021