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;
}
}
这是我使用上述球员颜色图案的一个例子。有没有人看到我可以优雅地减少这段代码的方法?
如何简化这段代码?一定有办法,因为这里有一个对称模式
我尝试过的事情
我尝试编写一种方法,将用户的 color
与 max
white
和 black
一起接收,但我似乎总是回到和我写的一样的代码,没有任何进展。
您可以使用三元运算符并完全删除嵌套的 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;
}
我更愿意从 white
和 black
创建一个数组,而不是独立变量 - 然后您可以计算目标索引,适当分配,并对 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;
}
我正在编写一个实用的国际象棋应用程序,我有一些重复的代码模式,在不同的方法中不断重复。
基本上,我正在跟踪用户的颜色{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;
}
}
这是我使用上述球员颜色图案的一个例子。有没有人看到我可以优雅地减少这段代码的方法?
如何简化这段代码?一定有办法,因为这里有一个对称模式
我尝试过的事情
我尝试编写一种方法,将用户的 color
与 max
white
和 black
一起接收,但我似乎总是回到和我写的一样的代码,没有任何进展。
您可以使用三元运算符并完全删除嵌套的 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;
}
我更愿意从 white
和 black
创建一个数组,而不是独立变量 - 然后您可以计算目标索引,适当分配,并对 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;
}