如何根据函数名(多个 ifs)进行重构?

How can I refactor based on the name of a function (multiple ifs)?

我在试图清理和精简的遗留项目中看到这段代码。

我有一个结构基本相同的多重 if 条件:

async function _validateRenderRequestById({
  id: requestId,
  user = null,
  uploadToCampaign = false,
  requestGroups = null,
}) {
  const request = await getRequestTasksById(requestId);
  if (!request) return null;

  let validated = false;
  const payload = { request, user, uploadToCampaign };
  if (request.type === requestTypes.r && request.RequestTasks.length) {
    validated = await _validateRequest({ ...payload, renderGroups });
  }
  if (request.type === requestTypes.a && request.ARequestTasks.length) {
    validated = await _validateARequest({ ...payload, renderGroups });
  }
  if (request.type === requestTypes.e && request.ERequestTasks.length) {
    validated = await _validateERequest(payload);
  }
  if (request.type === requestTypes.s && request.SRequestTasks.length) {
    validated = await _validateSRequest(payload);
  }

  ...
}

我不完全确定这是否值得改变,但如果你想改变它 table-driven,你可以通过定义一个 table 来这样做,你可以查找 requestType然后获取您正在检查 .length 的数组的 属性 名称以及匹配的验证函数参考:

const requestMap = {
    [requestTypes.r]: {name: "RequestTasks", fn: _validateRequest},
    [requestTypes.a]: {name: "ARequestTasks", fn: _validateARequest},
    [requestTypes.e]: {name: "ERequestTasks", fn: _validateERequest},
    [requestTypes.s]: {name: "SRequestTasks", fn: _validateSRequest},
};

async function _validateRenderRequestById({
    id: requestId,
    user = null,
    uploadToCampaign = false,
    requestGroups = null,
}) {
    const request = await getRequestTasksById(requestId);
    if (!request) return null;

    let validated = false;
    const payload = {
        request,
        user,
        uploadToCampaign
    };
    let requestInfo = requestMap[request.type];
    if (requestInfo && request[requestInfo.name].length) {
        validated = await requestInfo.fn({
            ...payload,
            renderGroups
        });
    }

    ...
}