我正在寻找是否有替代方法可以更干净,更高效地编写此代码。 我的目标是根据一天中的小时设置不同的值。
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;
非常感谢您的帮助!谢谢?
答案 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)
这是不使用if
或switch
的替代方法:
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);