澄清这个Javascript三元

Clarify this Javascript ternary

有人可以将这个嵌套的三元组拆分成多个三元组或其他代码或用英语解释吗?我从来没有遇到过这样的嵌套三元,所以我不确定操作顺序:

var EqualizeCheck = (IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON) ? (EqualizeCompleteTime != "") ? (EqualizeCompleteTime <= CurrentDateTime) ? true : false : false : true;

好了:

let EqualizeCheck;

if (IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON) {
  if (EqualizeCompleteTime != "") {
    if (EqualizeCompleteTime <= CurrentDateTime) {
      EqualizeCheck = true;
    } else {
      EqualizeCheck = false;
    }
  } else {
    EqualizeCheck = false;
  }
} else {
  EqualizeCheck = true;
}

我知道这不是你写的,但我应该指出嵌套这么多三元表达式是一种不好的做法,而且会导致代码不可读。

要获得更好的想法,只需打破它并尝试应用 if-else 然后您就可以轻松理解。而且@Sagi Rika 提到的事情是正确的,许多三元表达式的嵌套降低了代码的可读性,导致难以理解。

首先让我们打破你的三元表达式如下:

var EqualizeCheck = (IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON)
    ? (EqualizeCompleteTime != "") 
    ? (EqualizeCompleteTime <= CurrentDateTime) 
    ? true 
    : false 
    : false 
    : true;

如果你用if-else打破它,那么它会像下面这样:

var EqualizeCheck;

if (IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON) {
   if (EqualizeCompleteTime != "") {
      if (EqualizeCompleteTime <= CurrentDateTime) {
         EqualizeCheck = true;
      } else {
         EqualizeCheck = false;
      }
   } else {
         EqualizeCheck = false;
   }
} else {
     EqualizeCheck = true;
}

为了更好地理解,让我们举一个使用 if-else 的例子。就像如果年龄大于 18 那么 canVote 将是 true 否则 canVote 将是 false

var age = 19;
var canVote;

if (age > 18) {
   canVote = 'yes';
} else {
   canVote = 'no';
}

如果我们使用三元表达式编写上面的代码,那将是这样的:

var age = 19;
var canVote = age > 18 ? 'yes' : 'no';

要逐步完成它,首先分离最嵌套的条件(寻找完整的 condition ? value : value 语句)在这种情况下就是这个位:

var EqualizeCheck = (IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON) ? (EqualizeCompleteTime != "") ? (EqualizeCompleteTime <= CurrentDateTime) ? true : false : false : true;

将其分开并针对每个三元条件重复,直到您得到如下内容:

// Condition 1:
(IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON) ? 
    // Condition 1 == true, check the next condition
    // Condition 2: 
    (EqualizeCompleteTime != "") ? 
        // Condition 2 == true, check the next condition
        // Condition 3:
        (EqualizeCompleteTime <= CurrentDateTime) ? 
            // Condition 3 == true, return true
            true :
            // Condition 3 == false, return false
            false :
        // Condition 2 == false, return false
        false :
    // Condition 1 == false, return true
    true;

由于这基本上归结为两个成功条件(条件 1 为假,或者条件 2 和 3 都为真),您可以将其大大简化为:

var EqualizeCheck = 
  !IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON) ||
  ( 
    EqualizeCompleteTime != "" &&
    EqualizeCompleteTime <= CurrentDateTime
  )

这是上述三元运算符的更易读的友好版本。

const EqualizeCheck = (IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON) ? 
((EqualizeCompleteTime != "") ? ((EqualizeCompleteTime <= CurrentDateTime) ? true : false) : false) : true;

如果将其分成几个三元运算符语句,它将如下所示。我希望这种格式很容易理解。

const EqualizeValueCheck = (IIO.ReadDigitalInput(IO_GROUP_CHARGERS, subGroupName, IO_ITEM_ENABLEEQUALIZE) == IO_INPUT_ON);
const EqualizeCompleteTimeCheck = (EqualizeCompleteTime <= CurrentDateTime) ? true : false;
const EqualizeCompleteTimeEmptyValueCheck = (EqualizeCompleteTime != "") ? EqualizeCompleteTimeCheck : false;
const EqualizeCheck = (EqualizeValueCheck) ? EqualizeCompleteTimeEmptyValueCheck : false;