首页 > 解决方案 > 在 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 },但它不会。

这代表了公司中最常见的季度类型。

标签: javascript

解决方案


您可以取 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; }


推荐阅读