【问题标题】:What would the best way to clean these if statements up?清理这些 if 语句的最佳方法是什么?
【发布时间】:2019-08-30 17:09:00
【问题描述】:

我正在使用一个非常简单的 if 语句树,并希望尽可能地编写 DRY 代码,我相信我正在为我的用例实现 DRYest 代码并尝试写入指向对象键的指针 (如果没有 setter 函数似乎不可能) 并简化大括号,但出于问题的目的,我将它们留在里面,以明确需要做什么。

这个 if 树有更简单的版本吗?

let query = {};

if (min_budget || max_budget) {
    if(min_budget && max_budget) {
        query['budget.middleBound'] = { $gte: min_budget, $lte: max_budget } 
    } else if (min_budget && !max_budget) {
        query['budget.middleBound'] = { $gte: min_budget }
    } else if (max_budget && !min_budget) {
        query['budget.middleBound'] = { $lte: max_budget }
    }
}

【问题讨论】:

  • 一旦您检查了min_budget && max_budget,就没有理由随后明确检查!min_budget!max_budget
  • @Pointy 是的!很有帮助。感谢您,我已经应用了上面的编辑
  • min_budgetmax_budget 包含什么?
  • 外层 if 在这里没有任何作用
  • @Bdyce - 不要在这里根据反馈不断编辑您的问题(除了澄清人们感到困惑的事情)。 Stackoverflow 应该是你问一个问题,你会得到一个或多个答案。你不会不断地改变问题。

标签: javascript node.js syntax


【解决方案1】:

整合各种 cmets:

let query = {};
if (min_budget && max_budget) {
    query['budget.middleBound'] = { $gte: min_budget, $lte: max_budget }; 
} else if (min_budget) { // ***
    query['budget.middleBound'] = { $gte: min_budget };
} else if (max_budget) { // ***
    query['budget.middleBound'] = { $lte: max_budget };
}

除非有更多特定领域的信息,否则这可能是简单直接的版本。

如果您不介意修改现有对象,只需两个 ifs 即可:

let query = {};
if (min_budget || max_budget) {
    const mb = query['budget.middleBound'] = {};
    if (min_budget) {
        mb.$gte = min_budget;
    }
    if (max_budget) {
        mb.$lte = max_budget;
    }
}

【讨论】:

  • @jfriend00 - 我以为我看到了一条评论说它是必需的,但我肯定看不到它的需要(在顶部代码块中)。正在删除... :-)
  • @T.J.Crowder 是的,是我建议删除外部 if,但后来意识到 in 确实有一个用例(在实际场景中根本不重要),当两个值都是虚假的时它不需要检查内部条件,但我更喜欢将它们删除:)
  • @Cristy - 哇,我错过了.!!!固定的。 :-) 我想知道 OP 真的 是否想要一个带有. 的属性...
  • 只使用query.budget.middleBound,不带引号和括号
  • @Train - 这取决于 OP。我假设这将用于某些 API,该 API 期望看到与他们给出的名称完全相同的属性。
【解决方案2】:

如果你只关心语法和短代码,你可以使用short-circuit evaluation

    let query = {};
    let bound = (min_budget || max_budget) && (query['budget.middleBound'] = {});
    min_budget && (bound.$gte = min_budget);
    max_budget && (bound.$lte = max_budget);

代码的想法是,如果我们需要添加最小或最大条件,我们首先在query['budget.middleBound'] 创建一个新的Object。 我们还在bound 中保存了一个引用并进一步使用它(因此我们不必再次访问query 上的budget.middleBound 属性,它的名称很长)。如果需要,我们仍然只创建一个额外的Object

请注意,在创建 Objects 后添加属性比创建 Object 时所有键都已存在要慢。

通常不建议在生产环境中编写这样的代码,因为需要更多时间来理解代码在执行时的作用。

【讨论】:

  • 喜欢将&& 纯粹用于副作用。 if 是这里的正确构造。
  • 我也不太喜欢这里,但我喜欢它的可选功能:func && func(); 而不是if(func) { func(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多