运算符的条件运算符

时间:2019-03-08 19:24:36

标签: javascript operators ternary

我有一段代码:

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
}

谢谢!

6 个答案:

答案 0 :(得分:5)

您可以将支票转换为数字,或将-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 :(得分:4)

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

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

编辑:

我了解您的具体问题。我敢肯定我会因为这样说而被私刑,但是您可以使用eval()将其评估为字符串。如果以下任何内容来自unsantized用户数据,则不建议使用。

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;

答案 2 :(得分:4)

您快到了。 foo - bar可以写为foo + -bar。因此伪代码可以写为:

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

答案 3 :(得分: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

答案 4 :(得分:2)

类似这样的

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

答案 5 :(得分:1)

您可以使用三元运算符,就像您尝试原始答案一样。三元运算符的语法应为condition ? true : false;

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

您提到它“可能比这复杂得多”,这对于解决方案而言并不够清晰。根据复杂程度,三元运算符可能工作。您可以了解有关三元运算符here的更多信息。