【问题标题】:logical operators and if statements combination逻辑运算符和 if 语句组合
【发布时间】:2019-12-28 13:27:47
【问题描述】:

我正在寻找是否有替代方法可以更简洁高效地编写此代码。 我的目标是根据一天中的时间设置不同的值。

var hour = new Date().getHours();
var user = 'User4';

if (hour >= 4 && hour < 6) {
    user = 'User1';
}
if (hour >= 6 && hour < 13) {
    user = 'User2';
}
if (hour >= 13 && hour < 19) {
    user = 'User3';
}
if (hour >= 19) {
    user = 'User4';
}

我在网上找到this article,但我无法实现逻辑运算符。

let values = {
    a: 1,
    b: 2,
};
let foo = values[ bar ] || 3;

非常感谢您的帮助!谢谢??????

【问题讨论】:

    标签: javascript if-statement logical-operators


    【解决方案1】:

    您可以使用else if 使代码更短更简洁

    var hour = new Date().getHours();
    var user;
    
    if (hour < 4 || hour >= 19) {
      user = 'User4';
    } else if (hour < 6) {
      user = 'User1';
    } else if (hour < 13) {
      user = 'User2';
    } else if (hour < 19) {
      user = 'User3';
    }
    
    console.log(user)

    使用 switch(true)

    var hour = new Date().getHours();
    var user;
    
    switch(true) {
      case (hour < 4 || 
            hour >= 19): user = 'User4'; break;
      case (hour < 6)  : user = 'User1'; break;
      case (hour < 13) : user = 'User2'; break;
      case (hour < 19) : user = 'User3'; break;
    }
    
    console.log(user)

    【讨论】:

    • 他们分享的文章列出了 if-else 和 switch 的替代方案,所以我不确定这是否有帮助。
    • @Saurav 但是你怎么能用对象文字来实现呢?他正在寻求替代和更清洁的解决方案
    • 这并不一定意味着在这里使用对象,但是如果 bar=a。用户将获得值为 1。这只是使用 JavaScript OR 运算符,如果 bar 没有赋值,则 obj[bar] 将不返回任何内容,并且 user 的值将被赋值为 3。
    【解决方案2】:

    如何使用条件运算符

    var hour = new Date().getHours();
    var user = 'User4'
    
    user=(hour >= 4 && hour < 6)?'User1': (hour >= 6 && hour < 13)?'User2':(hour >= 13 && hour < 19)?'User3':(hour >= 19)?'User4':''
    console.log(user)

    【讨论】:

      【解决方案3】:

      如果你的意思是你想通过三元运算符来做,你可以试试

      let user = hour <13? (hour >= 6 && hour < 13)? "User 2" : "User 1" : (hour >= 13 && hour < 19)? "User 3" : "User 4"
      

      这应该是实现所需结果的最简单方法,但是您可以继续使用自己的示例并执行类似

      的操作
      let values = {
          a: "User 1",
          b: "User 2",
          c: "User 3",
          d: "User 4"
      };
      
      
      let bar = hour <13? (hour >= 6 && hour < 13)? "b" : "a" : (hour >= 13 && hour < 19)? "c" : "d"
      
      let foo = values[ bar ] || 3;
      

      【讨论】:

        【解决方案4】:

        如果你想把这个写成一个对象,你需要列出所有24小时,让代码更简单,但更长:

        var hour = new Date().getHours();
        var name = 'User';
        var id = {
           0: 4,
           1: 4,
           2: 4,
           3: 4,
           4: 1,
           5: 1,
           6: 2,
           7: 2,
           8: 2,
           9: 2,
          10: 2,
          11: 2,
          12: 2,
          13: 3,
          14: 3,
          15: 3,
          16: 3,
          17: 3,
          18: 3,
          19: 4,
          20: 4,
          21: 4,
          22: 4,
          23: 4
        };
        var user = name + id[ hour];
        console.log(user);

        正如您链接的文章中所述,我觉得这是三元组使事情变得丑陋的逻辑块之一。

        所以我个人更喜欢下面的 if/else 版本,因为它最易读,就好像它是“纯英语”一样。

        【讨论】:

          【解决方案5】:

          这是不使用ifswitch 的替代方案:

          var periods = [
            { from: 0, to: 4, user: 'User4' },
            { from: 4, to: 6, user: 'User1' },
            { from: 6, to: 13, user: 'User2' },
            { from: 13, to: 19, user: 'User3' },
            { from: 19, to: 23, user: 'User4' }
          ]; 
          
          var hour = new Date().getHours();
          var user = periods.find(p => hour >= p.from && hour < p.to).user; 
          

          【讨论】:

            【解决方案6】:

            您可以将条件移动到自己的函数中以获取用户并在条件匹配时提前返回。

            function getUser(hour) {
                if (hour < 4) return 'User4';
                if (hour < 6) return 'User1';
                if (hour < 13) return 'User2';
                if (hour < 19) return 'User3';
                return 'User4';
            }
            
            var hour = new Date().getHours(),
                user = getUser(hour);
            
            console.log(user);

            【讨论】:

              【解决方案7】:

              我不明白@Asaf 的要求,但如果他想要类似下面的东西

              let values = {
                  a: 1,
                  b: 2,
              };
              let foo = values[ bar ] || 3;
              

              他可以尝试这样的事情(这不是首选的方式)

              var hour = new Date().getHours();
              let values = {
                4 : 'User1',
                5 : 'User1',
                6 : 'User2',
                7 : 'User2',
                8 : 'User2',
                9 : 'User2',
                10 : 'User2',
                11 : 'User2',
                12 : 'User2',
                13 : 'User3',
                14 : 'User3',  
                15 : 'User3',  
                16 : 'User3',  
                17 : 'User3',  
                18 : 'User3',  
              };
              let foo = values[ hour ] || 'User4';
              console.log(foo);
              

              【讨论】:

                【解决方案8】:

                Code golf 的角度来看,链接ternary operator 可能是最短的方法。
                但是,如果它在一长行中使用,则对可读性没有帮助。
                但是一些代码缩进会有所帮助。

                var hour = new Date().getHours();
                
                var user = (hour >= 4 && hour <= 5 ? "User1"
                          : hour >= 6 && hour <= 12 ? "User2"
                          : hour >= 13 && hour <= 18 ? "User3"
                          : hour >= 19 ? "User4"
                          : "User4");
                
                console.log(hour, user);

                或者这个更短的版本:

                var hour = new Date().getHours();
                
                var user = (hour < 4 || hour > 18 ? "User4"
                          : hour < 6 ? "User1"
                          : hour < 13 ? "User2"
                          : "User3");
                
                console.log(hour, user);

                【讨论】:

                  【解决方案9】:

                  您当前的方法很好并且很有效。您可以采用的另一种方法是函数式方法,您可以使用如下函数定义每个范围:

                  const hour = new Date().getHours();
                  const I = x => x;
                  const K = x => y => x;
                  const setRange = (x, y, out) => (f, h) => f(h >= x && h < y)(out);
                  const createRanges = (...ranges) => def => h => {
                    for(const rf of ranges) 
                      if(rf(K, h)) return rf(K(I), h);
                    return def;
                  }
                  
                  const getUser = createRanges(
                    setRange(4, 6, 'User1'),
                    setRange(6, 13, 'User2'),
                    setRange(13, 19, 'User3')
                  )("User4"); // default/else "User 4"
                  const user = getUser(hour);
                  
                  console.log(hour, user);

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-01-01
                    • 2020-04-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-06-15
                    相关资源
                    最近更新 更多