逻辑运算符和 if 语句组合



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

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

我在网上找到了这篇文章,但我无法实现逻辑运算符。

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

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

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

使用条件运算符怎么样

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)

如果你想通过三元运算符来做到这一点,你可以试试

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;

如果你想把它写成一个对象,你需要列出所有 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版本,因为它是最易读的,就好像它是"简单的英语"。

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

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

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

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

从 Code 高尔夫的角度来看,链接三元运算符可能是最短的方法。
但是,如果将其用于一长行,则无助于提高可读性。
但是一些代码缩进会有所帮助。

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

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

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

相关内容

  • 没有找到相关文章

最新更新