逻辑运算符和if语句组合

时间:2019-12-28 13:27:47

标签: javascript if-statement logical-operators

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

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';
}

我在网上找到了这篇文章https://blog.wax-o.com/2015/05/an-alternative-to-if-else-and-switch-in-javascript/ 但是我无法实现逻辑运算符。

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

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

9 个答案:

答案 0 :(得分:2)

您可以使用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)

答案 1 :(得分:1)

使用条件运算符

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)

答案 2 :(得分:1)

如果您想由三元运算符来做,可以尝试

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;

答案 3 :(得分:1)

我不知道@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);

答案 4 :(得分:1)

如果要将其写为一个对象,则需要列出所有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 :(得分:1)

这是不使用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 :(得分:0)

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

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);

答案 7 :(得分:0)

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);

答案 8 :(得分:0)

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

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);