Javascript ,简化一个方法

Javascript ,simplifying a method

我正在编写一个实用的国际象棋应用程序,我有一些重复的代码模式,在不同的方法中不断重复。

基本上,我正在跟踪用户的颜色{white, black}。如果用户是 white,那么他们的动作会遵循模式 moves[i] % 2 ==0(因为白人玩家总是开始游戏)。

if (userColor === "white") {
    if(length % 2 === 0) {
      max = white = time - timeA;
      black = time - timeB;
    } else {
      max= black = time - timeA;
      white = time - timeB;
    }
  } else {
    if(length % 2 === 0) {
      max = black = time - timeA;
      white = time - timeB;
    } else {
      max = white = time - timeA;
      black = time - timeB;
    }
  }

这是我使用上述球员颜色图案的一个例子。有没有人看到我可以优雅地减少这段代码的方法?

如何简化这段代码?一定有办法,因为这里有一个对称模式

我尝试过的事情

我尝试编写一种方法,将用户的 colormax whiteblack 一起接收,但我似乎总是回到和我写的一样的代码,没有任何进展。

您可以使用三元运算符并完全删除嵌套的 if/else 语句:

if (userColor === "white") {
    max = (length % 2 === 0 ? white : black) = time - timeA;
    black = time - timeB;
} else {
    max = (length % 2 === 0 ? black : white) = time - timeA;
    white = time - timeB;
}

我更愿意从 whiteblack 创建一个数组,而不是独立变量 - 然后您可以计算目标索引,适当分配,并对 1 - index元素也是。

const colors = [white, black];
// always use `colors` now instead of white and black
// and make userColor into userColorIndex - an index of 0 for white, 1 for black - or use a boolean `userIsWhite`
const evenTurn = length % 2;
const newMaxColorWhite = userIsWhite && evenTurn || !userIsWhite && !evenTurn;
const index = newMaxColorWhite ? 0 : 1;
max = colors[index] = time - timeA;
colors[1 - index] = time - timeB;

newMaxColorWhite 变量不是 必需的 - 您可以完全省略它并使用条件运算符在一行中定义索引 - 但我认为它使得代码的意图更清晰。

const index = userIsWhite && evenTurn || !userIsWhite && !evenTurn ? 0 : 1;
max = colors[index] = time - timeA;
colors[1 - index] = time - timeB;

你也可以替换

userIsWhite && evenTurn || !userIsWhite && !evenTurn

userIsWhite === evenTurn

但这可能不是那么容易理解。

这是一个异或逻辑

if ((userColor !== 'white') ^ (length % 2))
  {
  max   = black = time - timeA;
  white = time - timeB;
  }
else
  {
  max   = white = time - timeA;
  black = time - timeB;
  }