Javascript 不允许重复值的字段数组验证

Javascript 不允许重复值的字段数组验证,javascript,reactjs,redux,duplicates,redux-form,Javascript,Reactjs,Redux,Duplicates,Redux Form,我已经使用redux表单实现了一个字段数组组件。在我的字段数组中,我对输入中不包含例如字母进行了一些验证。我的验证功能是: const validateFieldArray = (values) => { const errors = { [LEGO_AMKA_ARRAY]: [] }; if (values.get(LEGO_AMKA_ARRAY)) { const amkas = values.get(LEGO_AMKA_ARRAY); amkas.

我已经使用redux表单实现了一个字段数组组件。在我的字段数组中,我对输入中不包含例如字母进行了一些验证。我的验证功能是:

const validateFieldArray = (values) => {
  const errors = {
    [LEGO_AMKA_ARRAY]: []
  };
  if (values.get(LEGO_AMKA_ARRAY)) {
    const amkas = values.get(LEGO_AMKA_ARRAY);
    amkas.forEach((field, index) => {
      const amkasErrors = {};
      const amkaField = field.get(AMKA_FIELD);
      if (!amkaField) {
        amkasErrors[AMKA_FIELD] = 'error.required';
        errors[LEGO_AMKA_ARRAY][index] = amkasErrors;
      } else if (onlyNumeric(amkaField) !== undefined) {
        amkasErrors[AMKA_FIELD] = 'error.numbers.allowed';
        errors[LEGO_AMKA_ARRAY][index] = amkasErrors;
      }
    });
  }
  return errors;
};
我想添加一个不允许重复条目的验证。如果我输入的值是在前一个字段中输入的,我不能允许这样做。我该怎么做


谢谢

您可以使用reduce为每个值及其在值数组中的出现情况创建一个字典(注意-您可能需要在reduce之前使用map,我不确定数组结构是什么样子)

然后在代码中:

const validateFieldArray = (values) => {
  const errors = {
    [LEGO_AMKA_ARRAY]: []
  };
  if (values.get(LEGO_AMKA_ARRAY)) {
    const amkas = values.get(LEGO_AMKA_ARRAY);
    const dictOccurrences = amkas.reduce((acc, curr) => ({
    ...acc,
    [curr]: acc[curr] ? acc[curr] + 1 : 1,
}), {});
    amkas.forEach((field, index) => {
      const amkasErrors = {};
      const amkaField = field.get(AMKA_FIELD);
      if (!amkaField) {
        amkasErrors[AMKA_FIELD] = 'error.required';
        errors[LEGO_AMKA_ARRAY][index] = amkasErrors;
      } else if (onlyNumeric(amkaField) !== undefined) {
        amkasErrors[AMKA_FIELD] = 'error.numbers.allowed';
      }
      if (dictOccurrences[amkaField] > 1) {
        amkasErrors[AMKA_FIELD] = 'error.duplicate';
      }
      errors[LEGO_AMKA_ARRAY][index] = amkasErrors;
    });
  }
  return errors;
};
const validateFieldArray = (values) => {
  const errors = {
    [LEGO_AMKA_ARRAY]: []
  };
  if (values.get(LEGO_AMKA_ARRAY)) {
    const amkas = values.get(LEGO_AMKA_ARRAY);
    const dictOccurrences = amkas.reduce((acc, curr) => ({
    ...acc,
    [curr]: acc[curr] ? acc[curr] + 1 : 1,
}), {});
    amkas.forEach((field, index) => {
      const amkasErrors = {};
      const amkaField = field.get(AMKA_FIELD);
      if (!amkaField) {
        amkasErrors[AMKA_FIELD] = 'error.required';
        errors[LEGO_AMKA_ARRAY][index] = amkasErrors;
      } else if (onlyNumeric(amkaField) !== undefined) {
        amkasErrors[AMKA_FIELD] = 'error.numbers.allowed';
      }
      if (dictOccurrences[amkaField] > 1) {
        amkasErrors[AMKA_FIELD] = 'error.duplicate';
      }
      errors[LEGO_AMKA_ARRAY][index] = amkasErrors;
    });
  }
  return errors;
};