如果我为一个函数提供一个数字,我将如何根据像这样的一系列数字来验证它?
1-10 = A
11-20 = B
21-30 = C
...
我知道我可以执行 if
语句来评估它,但我正在寻找更优雅的东西,因为问题变得更加复杂,我不想要一个令人讨厌的 ifs 网络。
var letter = "";
function getLetter(num) {
if (num >= 1 && num <= 10) {
letter = "A";
} else if (num >= 11 && num <= 20) {
letter = "B";
}
// this eventually gets gross
}
getLetter(14)
的预期结果为 "B"
,而 getLetter(49)
的预期结果为 "E"
等。出于类似原因,case/switch 也不在讨论范围内。
欢迎任何其他想法。
最佳答案
关于您的代码的一点
function getLetter(num) {
if (num >= 1 && num <= 10) {
letter = "A";
} else if (num >= 11 && num <= 20) {
letter = "B";
}
// this eventually gets gross
}
这可以简化为
function getLetter(num) {
if (num >= 1) {
if(num <= 10) {
letter = "A";
} else if (num <= 20) {
letter = "B";
}
// this eventually gets gross too
}
}
但是:
如果简单到每个字母代表 10 个值的范围:
function getLetter(num) {
return String.fromCharCode(65 + Math.floor((num - 1) / 10));
}
console.log(getLetter(1));
console.log(getLetter(14));
console.log(getLetter(49));
或按照建议
function getLetter(num) {
const ret = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
return ret[Math.floor((num - 1) / 10)] || "+"; // greater than 260
}
console.log(getLetter(1));
console.log(getLetter(14));
console.log(getLetter(49));
console.log(getLetter(261));
function getLetter(number) {
let ranges = {
a: 10,
b: 20,
c: 30,
underflow: 0,
overflow: Infinity
}
return Object.entries(ranges)
.sort(([ka, va], [kb, vb]) => va - vb) // because object key sort order isn't guaranteed
// though it will be in the order as declared, but
// sorting makes sense
.find(([key, value]) => number <= value)[0];
}
console.log(getLetter(5))
console.log(getLetter(17))
console.log(getLetter(20))
console.log(getLetter(30))
console.log(getLetter(31))
console.log(getLetter(0))
如果范围是连续的,你只需要一个边界
关于javascript - 用于确定数值落入哪个范围的优雅解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58513895/