javascript - 在 Javascript 中查找范围内的值
问题描述
我有一个看起来像这样的数据结构,它代表公司的不同季度:
var quarters = [
{ beginning: 11, end: 1 },
{ beginning: 2, end: 4 },
{ beginning: 5, end: 7 },
{ beginning: 8, end: 10 }
]
现在,给定一个数字,我们称它为month
。我需要获取该数组中的哪个对象有月份。例如,如果month
是 12,它应该给我第一个对象{ beginning: 11, end: 1 }
我做了这个功能:
function findQuarter(month) {
return quarters.find(
q => q.beginning <= month && q.end >= month + 1,
);
}
但是例如,如果月份是 11,它不会找到任何季度,它应该找到第一个。它不知道end
不一定需要更大。
该 Quarters 变量是可定制的,因此它可以不同,例如:
var quarters = [
{ beginning: 1, end: 3 },
{ beginning: 4, end: 6 },
{ beginning: 7, end: 9 },
{ beginning: 10, end: 12 }
]
或者
var quarters = [
{ beginning: 12, end: 2 },
{ beginning: 3, end: 5 },
{ beginning: 6, end: 8 },
{ beginning: 9, end: 11 }
]
如果给定的月份1
应该找到{ beginning: 12, end: 2 }
,但它不会。
这代表了公司中最常见的季度类型。
解决方案
您可以取 12 的余数并将该值调整为介于零和最大槽长度之间的固定间隔。
这种方法使用模式将开头的值移动到零
(value + 12 - beginning) % 12
^^ keep the result positive
^^^^^^^^^ take zero instead of a beginning
^^^^ prevent number greater than 12
并以更小或等于检查的调整结束。余数运算符通过使用零基值将值保持在所需范围内,所有值也小于十二。
function findMonth(month) {
return quarters.find(({ beginning, end }) =>
(month + 12 - beginning) % 12 <= (end + 12 - beginning) % 12
);
}
var quarters = [
{ beginning: 8, end: 10 },
{ beginning: 11, end: 1 },
{ beginning: 2, end: 4 },
{ beginning: 5, end: 7 }
];
console.log(findMonth(1));
console.log(findMonth(2));
console.log(findMonth(3));
console.log(findMonth(4));
console.log(findMonth(5));
console.log(findMonth(6));
console.log(findMonth(7));
console.log(findMonth(8));
console.log(findMonth(9));
console.log(findMonth(10));
console.log(findMonth(11));
console.log(findMonth(12));
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- python - 如何在 jupyter notebook 中添加 UCB 模块?
- angular - 从两个不同的 URL 验证 Keycloak 令牌
- bash - grep multiples 结果随机导致 bash
- c++ - 无法使用 Qt Designer 和 Clion 将小部件添加到 QMainWindow
- parallel-processing - 使用 MPI Windows (MPI_Put) 传递数据时出现段错误
- c - 如何在 RPN 计算期间输出堆栈内的元素
- date - 如何检查日期验证?
- node.js - Discord.JS setInterval - 嵌入消息问题
- ruby - 初学者问题:ruby中字符串前面的加号有什么作用?
- java - 斯坦福 NPL 在 Spark (Scala) 应用程序中运行到 Java 堆空间 (java.lang.OutOfMemoryError)