逻辑运算符和 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);
这是一个不使用 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;
从 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);
我正在寻找是否有替代方法可以更清晰、更高效地编写此代码。 我的目标是根据一天中的小时设置不同的值。
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);
这是一个不使用 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;
从 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);