逻辑运算符和 if 语句组合

logical operators and if statements combination

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

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;

非常感谢您的帮助!谢谢

使用条件运算符怎么样

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)

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

使用 开关(真)

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)

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

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;

我不明白@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);

如果要把这个写成对象,需要列出所有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 版本,因为它最易读,就好像它是 'plain english'。

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

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

这是一个不使用 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; 

Code golf point of view, chaining the 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);

您可以将条件移动到自己的函数中,以便在条件匹配时尽早获取用户和return。

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