如何简化以下if语句和三元运算符?

时间:2017-10-18 07:20:57

标签: javascript

以下代码位于循环中,循环遍历表单的字段。如果isV1Usertrue,则会禁用该字段。如果用户有customSetting,则不要禁用该字段。如果用户没有,请将其禁用。

if (field.name === 'themeColor') {
  if (this.isV1User) {
    field.disabled = false
  } else {
    field.disabled = this.user.customSetting
      ? !this.user.customSetting.themePicker
      : false
  }
}

如何简化或至少删除此代码的嵌套?

6 个答案:

答案 0 :(得分:3)

将每个if条件移至三元:

if (field.name === 'themeColor') {
    field.disabled = !this.isV1User && this.user.customSetting && !this.user.customSetting.themePicker;
}

答案 1 :(得分:1)

if (field.name === 'themeColor') {
    field.disabled = this.user.customSetting && !this.isV1User ?
    !this.user.customSetting.themePicker : false;
}

答案 2 :(得分:1)

这不是一个Stack Overflow问题,我认为它更符合Code Review。

似乎只有一组情况需要true,所以也许这样?

if (field.name === 'themeColor') {
    field.disabled = (
        !this.isV1User &&
        this.user.customSetting && !this.user.customSetting.themePicker);
}

仍需要第一个if,因为其他字段应保持不变(我假设)。

答案 3 :(得分:1)

你可以这样做

select index_name
from user_indexes

答案 4 :(得分:1)

您构建代码的方式,可以最小化到以下等效代码。请注意,如果this.user.customSetting.themePicker为真时保证this.user.customSetting始终为真,则可以在条件为field.disabled = true的单个if语句中设置field.name == 'themeColor'

if (field.name == 'themeColor' && this.user.customSetting) {
 field.disabled = !this.user.customSetting.themePicker;
} else if (field.name == 'themeColor') {
 field.disabled = false;
}

甚至可以使用以下switch语句,具体取决于您希望代码的结构。它们都是一样的。

switch (field.name) {
  case 'themeColor':
    if (this.user.customSetting) {
      field.disabled = !this.user.customSetting.themePicker;
    }
    break;
  default:
    field.disabled = false;
}

这些答案中的大多数都打破了三元语句可读性的基本规则。如果您的目标是简单的可读性,那么将其分解为简单的if/else if语句就行了。如果您尝试尽可能地减少代码,并且不关心它是否不可维护/难以阅读,则应将其简化为递归三元语句。就个人而言,我发现长三元语句不能提供显着的节省空间,妨碍可读性,并且应该避免在它们不是非常简单的情况下(即:var x = statement? 1 : 0;

答案 5 :(得分:0)

试试这个

if (field.name === 'themeColor') {
   field.disabled = this.isV1User ? true : this.user.customSetting ? !this.user.customSetting.themePicker : false;
}