试图从中提取共同的功能

Trying to extract common functionality among these

我有以下方法,我使用 reducer 在 reducer 中设置这些字典“earliestOptionByInitialRevision”和“latestOptionByInitialRevision”,代码如下所示

 const lookups = optionsInput?.reduce(
    (acc, option) => {
      const [optionById, earliestOptionByInitialRevision, latestOptionByInitialRevision] = acc;
      optionById[option.id] = option;
      const isCustomProject = option.initialRevisionId === null || option.initialRevisionId === undefined;
      if (
        isCustomProject ||
        !earliestOptionByInitialRevision[option.initialRevisionId] ||
        option.revision < earliestOptionByInitialRevision[option.initialRevisionId].revision
      ) {
          // trying to extract the below into common 
          //function because in  below if condition i have used the same and difference is
         // "earliestOptionByInitialRevision"

        if (isCustomProject) { 
          option = {...option, initialRevisionId:'customProjectOption'}
          if (!earliestOptionByInitialRevision[option.initialRevisionId]) 
          {
            earliestOptionByInitialRevision[option.initialRevisionId] = [option];
          } else {
            earliestOptionByInitialRevision[option.initialRevisionId].push(option);
          }
        } else {
          earliestOptionByInitialRevision[option.initialRevisionId] = option;
        }
      }
      if (
        isCustomProject ||
        !latestOptionByInitialRevision[option.initialRevisionId] ||
        option.revision > latestOptionByInitialRevision[option.initialRevisionId].revision
      ) {
        // the below if condition same as with above and the difference            
        // is "latestOptionByInitialRevision"

        if (isCustomProject) { 
          option = {...option, initialRevisionId:'customProjectOption'}
          if (!latestOptionByInitialRevision[option.initialRevisionId]) {
            latestOptionByInitialRevision[option.initialRevisionId] = [option];
          } else {
            latestOptionByInitialRevision[option.initialRevisionId].push(option);
          }
        } else {
          latestOptionByInitialRevision[option.initialRevisionId] = option;
        }
      }
      return acc;
    },
    [{}, {}, {}]
  ) ?? [{}, {}, {}];

  const [optionById, earliestOptionByInitialRevision, latestOptionByInitialRevision] = lookups;

我想提取以下常用功能,但无法了解如何实现相同功能。任何人都可以帮助这将非常感谢我

  if (isCustomProject) {
    option = {...option, initialRevisionId:'customProjectOption'}
    if (!earliestOptionByInitialRevision[option.initialRevisionId]) {
      earliestOptionByInitialRevision[option.initialRevisionId] = [option];
    } else {
      earliestOptionByInitialRevision[option.initialRevisionId].push(option);
    }
  } else {
    earliestOptionByInitialRevision[option.initialRevisionId] = option;
  }

非常感谢 更新:

一个快速解决方法是将常用功能提取到一个函数中,由字典(JavaScript 对象)参数化。

const optionsInput = [{
    id: 1,
    revision: 2
  },
  {
    id: 2,
    revision: 1
  },
];

  const lookups = optionsInput?.reduce(
    (acc, option) => {
      const [optionById, earliestOptionByInitialRevision, latestOptionByInitialRevision] = acc;
      optionById[option.id] = option;
      const isCustomProject = option.initialRevisionId === null || option.initialRevisionId === undefined;

      const updateDict = (dict) => {
          if (isCustomProject) {
            const newOption = {...option, initialRevisionId:'customProjectOption'}
            if (!dict[option.initialRevisionId]) {
              dict[option.initialRevisionId] = [newOption];
            } else {
              dict[option.initialRevisionId].push(newOption);
            }
          } else {
            dict[option.initialRevisionId] = option;
          }
      };
      
      if (isCustomProject || !earliestOptionByInitialRevision[option.initialRevisionId] || option.revision < earliestOptionByInitialRevision[option.initialRevisionId].revision) {
        updateDict(earliestOptionByInitialRevision);
      }
      
      if (isCustomProject || !latestOptionByInitialRevision[option.initialRevisionId] || option.revision > latestOptionByInitialRevision[option.initialRevisionId].revision) {
        updateDict(latestOptionByInitialRevision);
      }
      
      return acc;
    },
    [{}, {}, {}]
  ) ?? [{}, {}, {}];

console.log(lookups);