首页 > 解决方案 > 为什么 reducer 会忽略数组中的第一项?

问题描述

我有这个函数应该运行每个验证器,然后返回包含错误的对象。

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

我在这里遗漏了一些明显的东西吗?

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

    return {
      ...currentErrors,
      ...validationResult,
    };
  })
);

标签: javascriptarraysreduce

解决方案


如果您不提供要归约的初始值,那么它将使用数组的第一个元素作为初始值,并跳过使用该元素调用归约器。所以你的减速器第一次被调用时,currentErrorsisvalidateFullNamevalidatoris validateServicePresence

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

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

    return {
      ...currentErrors,
      ...validationResult,
    };
  }, {}) // <===================
);

See the initialValue section here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Parameters


推荐阅读