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

时间:2019-08-05 11:20:27

标签: 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,
    };
  })
);

2 个答案:

答案 0 :(得分:5)

如果不提供要减小的初始值,则它将使用数组的第一个元素作为初始值,并跳过使用该元素调用的reducer。因此,第一次调用化径器时,currentErrorsvalidateFullName,而validatorvalidateServicePresence

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

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

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

在此处查看initialValue部分:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Parameters

答案 1 :(得分:1)

默认情况下,如果没有提供起始值,color_image = k4a_capture_get_color_image(capture); if (color_image) { uint8_t* buffer = k4a_image_get_buffer(color_image); // get raw buffer cv::Mat colorMat(Hrgb, Wrgb, CV_8UC4, (void*)buffer, cv::Mat::AUTO_STEP); //do something with colorMat k4a_image_release(color_image); } 会将第一个元素用作累加器值。显式传递累加器的状态值将确保您的第一个元素也得到处理。

See the initialValue parameter on the MDN docs

Array.prototype.reduce