条件运算符用于操作符

5

我有一段代码:

if (foo > bar) {
    baz = foo - bar
} else {
    baz = foo + bar
}

我有一个问题,是否有办法将这段代码缩减到一行,类似于:

伪代码:

baz = foo (foo > bar ? + : -) bar

我想要缩短的真实代码

if (gradientStartH > gradientEndH) {
    h = gradientStartH - Math.abs(gradientStartH - gradientEndH) / arr.length * i
} else {
    h = gradientStartH + Math.abs(gradientStartH - gradientEndH) / arr.length * i
}

谢谢!


3
出于可读性和可维护性的考虑,如果操作“更加复杂”,应避免使用三元运算符。 - Taplar
baz = (foo > bar) ? (foo - bar) : (foo + bar) 的意思是:如果 foo 大于 bar,则 baz 等于 foo 减去 bar,否则 baz 等于 foo 加上 bar。 - el-teedee
@Taplar也许你是对的!但请看一下我想要“增强”的真实代码示例。 - Pavel T
6个回答

4
你已经接近成功了。"foo - bar" 可以写作 "foo + -bar"。 因此,伪代码可以写成:
baz = foo + (foo > bar ? +1 : -1) * bar

4
baz = foo > bar ? foo - bar : foo + bar;

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

编辑:

我理解你的具体问题。我很确定我会因为这样说而受到批评,但你可以使用 eval() 将其作为字符串进行评估。如果以下任何内容通过未经过处理的用户数据派生,则不建议使用。

h = eval(`${gradientStartH} ${gradientStartH > gradientEndH ? '-' : '+'} ${Math.abs(gradientStartH - gradientEndH) / arr.length * i}`);

否则就是一个不错的两行。首选。
const absVal = Math.abs(gradientStartH - gradientEndH) / arr.length * i;
h = gradientStartH > gradientEndH ? gradientStartH - absVal : gradientStartH + absVal;

4
您可以将检查转换为数字,或将-1作为因子。
baz = foo + (foo > bar || -1) * bar

最清晰的方法是使用一个包含操作数的对象,并进行获取操作数的检查。
op = {
    true: function (a, b) { return a + b; }, // add
    false: function (a, b) { return a - b; } // sub
}
baz = op[foo > bar](foo, bar);

你可能是指“对象”,我猜你的回答中有个笔误,+1 棒极了的回答。 - Code Maniac

4
您可以将if-elseMath.abs移除,只留下以下内容:
h = gradientStartH - (gradientStartH - gradientEndH) / arr.length * i

这里是一个片段,与您的代码进行比较:

// Your code 
function getDiffExisting(gradientStartH, gradientEndH, arr) {
  let h = 0;
  
  if (gradientStartH > gradientEndH) {
    h = gradientStartH - Math.abs(gradientStartH - gradientEndH) / arr.length
  } else {
    h = gradientStartH + Math.abs(gradientStartH - gradientEndH) / arr.length
  }
  
  return h;
}

console.log(getDiffExisting(200, 100, [1,2]))
console.log(getDiffExisting(50, 100, [1,2]))

function getDiffNew(gradientStartH, gradientEndH, arr) {
  let h = gradientStartH - (gradientStartH - gradientEndH) / arr.length
  return h;
}

console.log(getDiffNew(200, 100, [1,2]))
console.log(getDiffNew(50, 100, [1,2]))

(我为了测试目的删除了 i 标签)


不客气。您可以点击左侧的灰色复选标记将其标记为已接受的答案。 - adiga

2
最初的回答
类似这样的东西,
baz = foo > bar ? foo - bar : foo + bar

1
你可以使用三元运算符,就像你在原始答案中尝试过的那样。三元运算符的语法应该是 condition ? true : false;
baz = foo > bar ? foo-bar : foo+bar;

你提到这可能比这更加复杂,这并不允许我们有一个清晰的解决方案。根据复杂性,三目运算符可能不会起作用。您可以在这里阅读更多关于三目运算符的信息。

那是一个伪代码,我用它来更好地解释自己。 - Pavel T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接