【问题标题】:Convert true and false in Coffeescript to 1 and -1 respectively将 Coffeescript 中的 true 和 false 分别转换为 1 和 -1
【发布时间】:2011-12-22 19:38:23
【问题描述】:
if x < change.pageX # pageX is cross-browser normalized by jQuery
            val = Number(elem.text())
            return elem.text(o.max) if val + o.step > o.max
            return elem.text(o.min) if val + o.step < o.min
            elem.text(val + o.step)
else x > change.pageX
  # same thing, only - instead of +

(咖啡脚本,但你明白了)。我正在寻找一种技巧来获取布尔值并将其转换为 1(真)或 -1(假)。这样我就可以val + converted_bool * o.step 并保存一个 if。

【问题讨论】:

    标签: javascript jquery coffeescript code-golf


    【解决方案1】:

    你可以这样做......

    +x||-1
    

    • 如果x===true,则+x1-1短路。

    • 如果x===false,则+x0,返回-1


    这是另一种方式...

    [-1,1][+x]
    
    • 如果x===true[+x] 将获取数组的索引1

    • 如果x===false[+x] 将抓取数组的索引0

    【讨论】:

    • 第二种方式是纯JS吗?还是涉及咖啡?
    • @ajax333221:它们都是纯 JS。这个[-1,1] 创建了一个包含两个成员的数组,+xx 布尔值转换为0(如果为假)或1(如果为真)。因此[+x] 正在抓取[-1,1] 数组的索引01
    • ...但它也是有效的 CoffeeScript 语法。
    【解决方案2】:

    听起来像是conditional (ternary) operator 的工作

    if true then 1 else -1
    1
    if false then 1 else -1
    -1
    

    【讨论】:

    • 在 CoffeeScript 中 false ? 1 : -1 返回 false
    • 问题说的是 JavaScript。
    • CoffeeScript 中的三元组只需使用if/then/else:if true then 1 else -1
    • @Trevor Burnham — 我说的是“说”而不是“说”,问题标题已被编辑。
    【解决方案3】:

    我喜欢这样会起作用:

    b2i = (x) -> if x then 1 else -1
    b2i(true)  # => 1
    b2i(false) # => -1
    

    该函数定义将产生那个(不是很令人兴奋的)JavaScript:

    var b2i;
    
    b2i = function(x) {
      if (x) {
        return 1;
      } else {
        return -1;
      }
    };
    

    注意 CoffeeScript ? 是存在运算符,所以

    x ? 1 : -1
    

    将转换为有点意外

    if (typeof x !== "undefined" && x !== null) {
      x;
    } else {
      ({ 1: -1 });
    };
    

    【讨论】:

      【解决方案4】:

      (~true)+3 和 (~false) 会给你 1 和否定的 :)

      【讨论】:

      • 您需要一个额外的条件来选择要使用的表达式。
      • 打得很好,先生。打得很好。
      • 我在做 indexOf ... if(~"xyz".indexOf("y")) 时使用它
      【解决方案5】:

      啊哈!

      2 * (!!expression) - 1

      【讨论】:

      • 为什么要使用这个而不是上面的三元示例?
      • 如果expression 可以保证是布尔值,则不需要!! 演员表。去吧:2 * expression - 1
      【解决方案6】:

      您是否正在寻找除了这个普通的 javscript 之外的任何东西:

      boolVal ? 1 : -1
      

      或者,以函数形式:

      function convertBool(boolVal) {
          return(boolVal ? 1 : -1);
      }
      

      涉及布尔值的直接数学将true 转换为1false 转换为0

      var x,y;
      x = false;
      y = 2;
      alert(y + x);  // alerts 2
      
      x = true;
      y = 2;
      alert(y + x);  // alerts 3
      

      如果对性能感兴趣,这里有一个jsperf test,其中有四种方法作为答案提供。在 Chrome 中,三元解决方案的速度提高了 7 倍以上。

      【讨论】:

      【解决方案7】:

      你也可以在coffeescript中输入javascript:

      foo = `bar ? 1 : -1`
      

      【讨论】:

      • 你为什么不直接使用纯咖啡脚本? foo = if bar then 1 else -1
      • 该问题被标记为“代码高尔夫”,表明您对紧凑型解决方案很感兴趣。
      猜你喜欢
      • 2023-03-28
      • 2014-01-17
      • 2017-01-08
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多