javascript 函数中的多个参数和条件

multiple arguments and conditions in a function in javascript

我有一个函数可以return从对象数据库中获取一些关于员工的信息

我面临一些复杂的 ESlint 问题,所以我需要找到一种方法来最小化它或找到一种聪明的方法来做到这一点,而不是使用一整套 if 语句。

我也在尝试找到一种方法来解决这样的问题:如果我有 name,我不需要进行 id 验证,反之亦然,我只是不不知道怎么做... ‍♂️

该函数必须接收一个选项对象作为参数,该对象将决定其行为方式:

例如:

getEmployeesCoverage({ name: 'Sharonda' });
getEmployeesCoverage({ name: 'Spry' });
getEmployeesCoverage({ id: '4b40a139-d4dc-4f09-822d-ec25e819a5ad' });

我有3个条件:

  1. 验证我是否收到任何参数,例如 nameidundefined
  2. 验证 name 是否存在于数据库中
  3. 验证 id 是否存在于数据库中

我试过这个:

function getEmployeesCoverage({ name, id }) {

  if (employees.find((employee) => employee.id === id)) {
    return getEmployeeById(id); // 3. verify if id exists in database
  }
  if (
    employees.find((employee) => employee.lastName === name) ||
    employees.find((employee) => employee.firstName === name)
  ) {
    return getEmployeeByName(name); // 2. verify if the name exists in database
  }
  if (!name || !id) { 
    return getAllEmployees(); // 1. verify if i have any args e.g name or id undefined
  } 
  throw new Error('Invalid Information');
}

圈复杂度只是 ESLint 提供的一种风格建议,旨在鼓励您在单个函数中使用更少的代码分支(例如 ifs)。您可以忽略该警告或使用 ESLint pragmas (the rule in question is named complexity).

禁用它

如果您想要一个能够以不同方式查询的函数(就像您在代码中所做的那样),那么您的函数需要根据输入数据进行分支是理所当然的。

例如,Python 函数始终通过查询哪些 kwargs 提供给和未提供给“重载”函数来执行此操作,并且该函数会根据提供的参数更改行为。我不确定为什么你的 ESLint 配置了如此低的复杂度值,或者它可能具有低值。

上次我使用 ESLint 时,我发现自己立即禁用​​了三到四个“代码风格”建议。我个人认为默认情况下它过于自以为是。

也许你可以这样做;

var employee = o.id   ? employees.find(e => e.id === o.id) :
               o.name ? employees.find(e => e.lastName === o.name || e.firstName === o.name)
                      : undefined;

因此,如果 ESLint 抱怨嵌套三元,也许你可以尝试;

var employee = (o.id   && employees.find(e => e.id === o.id)) ||
               (o.name && employees.find(e => e.lastName === o.name || e.firstName === o.name));

如果都失败了,你会得到 false

我通过检查主函数中的参数解决了这个问题:

function getEmployeesCoverage({ name, id } = {}) {
  if (name) return getEmployeeByName(name);
  if (id) return getEmployeeById(id);
  if (!name || !id) return getAllEmployees();
}

然后调用唯一的作业函数来验证该参数是否存在于数据库中,如果不存在则抛出错误。

function getEmployeeByName(name) {
  if (employees.find((employee) => employee.lastName === name)
  || employees.find((employee) => employee.firstName === name)) {
    const {
      id: employeeId,
      firstName,
      lastName,
      responsibleFor,
    } = employees.find((employee) => employee.lastName === name)
    || employees.find((employee) => employee.firstName === name);
    return {
      id: employeeId,
      fullName: `${firstName} ${lastName}`,
      species: getSpeciesByIds(...responsibleFor).map((animal) => animal.name),
      locations: getSpeciesByIds(...responsibleFor).map((animal) => animal.location),
    };
  }
  throw new Error('Invalid Informations');
}