高级 Switch 语句

Advanced Switch statement

我想循环遍历一个项目数组,过滤掉有多个条件的元素,然后将它们推送到目标数组中。 结果应该有 4 个数组,其中包含满足每个特定数组条件的所有项目。像这样

// 4 cases of the parent array
const arrayOverDeadline_overBudget = []
const arrayOverDeadline_withinBudget = []

const arrayOneMonthDeadline_OverBudget = []
const arrayOneMonthDeadline_withinBudget = []

export const filterArray = (array) => {
  const today = moment();
  const oneMonthBefore = moment().add(1, "m");

  array.forEach((item) => {
    switch (item.deadline && item.budget) {
      // over deadline && over budget
      // (deadline <= today) && (budget > 100%)
      case params.deadline <= today && params.budget >= 100:
        break;

      // over deadline && within budget 
      // (deadline <= today) && (80% < budget < 100%)
      case params.deadline < today &&
        params.budget < 100 &&
        params.budget > 80:
        break;

      // within deadline && within budget 
      // (today < deadline < oneMonthBefore) && (80% <= budget < 100%)
      case params.deadline > today &&
      params.deadline < oneMonthBefore &&
      params.budget < 100 &&
      params.budget >= 80:        
      break;

      // within deadline && over budget
      // (today < deadline < oneMonthBefore) && (budget >= 100%)
      case params.deadline > today &&
      params.deadline < oneMonthBefore &&
      params.budget > 100:
        break;

      default:
        break;
    }
  });
};

我寻找了一些答案并找到了 Flags and Bitmasks 但不确定如何在我的案例中实施它。 我还担心我的方法的时间复杂度。 任何提示或想法都将受到欢迎和赞赏。

更新:

  1. 添加条件。
  2. 问题的目的是询问是否有更有效的方法将数组中的元素分布到所需位置。我已经尝试了 if..elseif...else 方法,但我只是想知道是否有“更清洁”的方法,它不必使用 switch 语句。

您可以简单地将其分解为 2 个布尔变量:

  1. bool1 = is project over the deadline
  2. bool2 = is project over the budget

从这些变量创建一个int(bool1右移一次+bool2)得到一个介于[0,3]之间的值,然后你可以将这个值映射到目标数组。

示例:

  1. bool1 = 0, bool2 = 0。目标值 = 00 (binary) = 0。目标值 0 映射到 under deadline, under budget.
  2. bool1 = 0, bool2 = 1。目标值 = 01 (binary) = 1。目标值 1 映射到 under deadline, over budget.
  3. bool1 = 1, bool2 = 0。目标值 = 10 (binary) = 2。目标值 2 映射到 over deadline, under budget.
  4. bool1 = 1, bool2 = 1。目标值 = 11 (binary) = 3。目标值 3 映射到 over deadline, over budget.

您只需使用一行代码即可生成此目标值,然后使用这些案例来确定目标数组应该无需编写复杂的 if-else 块。

编辑:

添加示例实现:

const budget = 100,
  deadline = 100
const item_budget = 120,
  item_deadline = 80
const b1 = Number(item_deadline > deadline)
const b2 = Number(item_budget > budget)
const target = (b1 << 1) + b2
switch (target) {
  case 0:
    console.log("under deadline, under budget")
    break;
  case 1:
    console.log("under deadline, over budget")
    break;
  case 2:
    console.log("over deadline, under budget")
    break;
  default:
    console.log("over deadline, over budget")
}
// prints "under deadline, over budget"