为什么reducer会忽略数组中的第一项?

Sky*_*pho 0 javascript arrays reduce

我具有应该运行每个验证程序然后返回包含错误的对象的功能。

一切似乎都可以正常工作,但是数组中的第一个验证器。似乎reduce完全忽略了它。不管我在那放什么验证器,它都会直接转到第二个验证器。

我在这里错过明显的东西吗?

export default values => (
  [
    validateFullName,
    validateServicePresence,
    validatePhoneField,
    validateOrganizationName,
    validateInn,
    validateEmailField,
    validateManagerEmail,
    validateComment,
    validateAgreement,
  ].reduce((currentErrors, validator) => {
    const validationResult = validator(values);

    return {
      ...currentErrors,
      ...validationResult,
    };
  })
);
Run Code Online (Sandbox Code Playgroud)

Nic*_*wer 5

如果您不提供要减少的初始值,则它将使用数组的第一个元素作为初始值,并跳过使用该元素调用的reducer。因此,您的reducer第一次被称为currentErrorsis validateFullName和validatoris validateServicePresence。

要解决此问题,只需添加一个初始值:

export default values => (
  [
    validateFullName,
    validateServicePresence,
    validatePhoneField,
    validateOrganizationName,
    validateInn,
    validateEmailField,
    validateManagerEmail,
    validateComment,
    validateAgreement,
  ].reduce((currentErrors, validator) => {
    const validationResult = validator(values);

    return {
      ...currentErrors,
      ...validationResult,
    };
  }, {}) // <===================
);
Run Code Online (Sandbox Code Playgroud)

请参阅此处的initialValue部分:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Parameters