缩短Javascript if-else结构

17 javascript

我的代码是:

 var level = function (d) {
    if (value(d) > median + stdev) {
        return 1;
    } else if (value(d) > median) {
        return 2;
    } else if (value(d) > median - stdev) {
        return 3;
    } else {
        return 4;
    }
 };
Run Code Online (Sandbox Code Playgroud)

这样做有更好的方法吗?

650*_*502 15

当然,value(d)多次调用是可以避免的.

您也可以使用对称性缩短一点:

  var level = function (d) {
    //
    //               -std    median  +std
    // ----------------|-------|-------|------------------
    // 4444444444444444 3333333 2222222 111111111111111111
    //
    var i = Math.floor((median - value(d)) / stddev) + 3;
    return Math.max(1, Math.min(4, i));
  };
Run Code Online (Sandbox Code Playgroud)

对于一个真正的项目可能不是一个好主意但是...我没有测试但是我发现这个代码比你问题中的原始代码慢得多并且我发现它更难维护也不会感到惊讶.

请注意,不包括一次性一次性脚本,通常代码会被写入一次并读取很多次(用于维护,如改进或调试),因此"更容易阅读"通常比"更容易编写"更重要.

当更短的意思是"更容易阅读"是一件好事,当它开始意味着"更难阅读"时它不是.

  • ascii艺术很好,但我不知道代码是如何"更好".它更"聪明",线条更少,但它使用了Math的除法和函数,通常不能使用名义尺度(https://en.wikipedia.org/wiki/Level_of_measurement#Nominal_scale).它的执行速度并不快.重构代码不再是直截了当的,例如,如果你想要其他值/其他类型的值或只是包括其他/更多的情况......这是代码高尔夫(http://en.wikipedia.org/wiki/Code_golf) ,但代码质量没有改善. (7认同)
  • @mnagel:我同意.请仔细检查问题标题是什么. (3认同)

HBP*_*HBP 7

要完成设置,这是switch@austin引用的方式:

var level = function (d) {
  var d = value(d) - median;
  switch (true) {
  case d > stdev : return 1;
  case d > 0:      return 2;
  case d > -stdev: return 3;
  default:         return 4;
  }
};
Run Code Online (Sandbox Code Playgroud)