在Javascript中查找范围中的值

在Javascript中查找范围中的值,javascript,Javascript,我的数据结构如下所示,它代表一家公司的不同部门: var quarters = [ { beginning: 11, end: 1 }, { beginning: 2, end: 4 }, { beginning: 5, end: 7 }, { beginning: 8, end: 10 } ] 现在,给定一个数字,让我们称之为月份。我需要得到数组中哪个对象的月份。例如,如果month是12,它应该给我第一个对象{开始:11,结束:1} 我做了这个功能: function findQu

我的数据结构如下所示,它代表一家公司的不同部门:

var quarters = [
 { beginning: 11, end: 1 },
 { beginning: 2, end: 4 },
 { beginning: 5, end: 7 },
 { beginning: 8, end: 10 }
]
现在,给定一个数字,让我们称之为月份。我需要得到数组中哪个对象的月份。例如,如果
month
是12,它应该给我第一个对象
{开始:11,结束:1}

我做了这个功能:

function findQuarter(month) {
 return quarters.find(
    q => q.beginning <= month && q.end >= month + 1,
  );
}

如果给定的月份是
1
,则应该找到
{start:12,end:2}
,但不会


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

您的条件不完整,我也使用
filter()
方法来实现以下目标:

功能查找季度(月){
回程过滤器(
q=>{
如果(q.开始=月){
返回q
}否则{
如果(q.开始>q.结束和月>q.结束和月>q.开始)返回q
}
}
);
}
var季度=[
{开始:1,结束:3},
{开始:11,结束:1},
{开始:4,结束:6},
{开始:7,结束:9},
{开始:10,结束:12}
]
控制台日志(findQuarter(1))
控制台日志(findQuarter(12))

console.log(findQuarter(9))
本杰明·格伦鲍姆说了什么。按如下方式更新您的函数:

function findQuarter(month) {
 return quarters.find(
    let effectiveEnd = (q.end < q.beginning) ? q.end + 12 : q.end
    q => q.beginning <= month && effectiveEnd >= month + 1,
  );
}
功能查找季度(月){
返回宿舍。查找(
让effectiveEnd=(q.endq.开始=月+1,
);
}

试试这样的方法

var季度=[{
开始日期:11,
完:1
},
{
开始:2,
完:4
},
{
开始日期:5,
完:7
},
{
开始日期:8,
完:10
}
];
功能查找季度(月){
//整理你的住处
四分之一=四分之一。排序(函数(a,b){
返回a.开始如果(q.beging,则可以取12的余数,并将该值调整为零和最大插槽长度之间的固定间隔

这种方法使用模式将开始的值移动到零

(value + 12 - beginning) % 12
         ^^                   keep the result positive
              ^^^^^^^^^       take zero instead of a beginning
                         ^^^^ prevent number greater than 12
余数运算符使用零基值将值保持在所需范围内,所有值也都小于12

功能查找月(月){
返回季度。查找({开始,结束})=>

(月+12-开始)%12我建议您以下解决方案:

    // QUARTERS SOURCE
    var quarters = [
      { beginning: 11, end: 1 },
      { beginning: 2, end: 4 },
      { beginning: 5, end: 7 },
      { beginning: 8, end: 10 }
    ];

    // FUNCTION
    const findQuarter = (month) => quarters.find(q => q.beginning <= month && q.end < q.beginning ? q.end + 12 : q.end >= month)

    // TO TEST
    for(var i = 1; i < 12; i++) {
      console.log(`The month ${i} is in the quarter ${findQuarter(i).beginning} - ${findQuarter(i).end}`);
    }

这就是你所需要的吗?:)

添加一个
if(end
?如果第一季度从
12开始到2结束,并且给定的月份是1,那么这个问题就解决不了了,因为开始时间会比给定的月份大,所以第一个条件不会满足。好的,然后添加一个
if(month>end)month=month+12
以及:)如果我这样做,那么对于其中一个季度是
开始:1,结束:3
且给定月份是2的情况,它将不起作用。如果输入错误,请参阅编辑:D(在第一个If之后)此解决方案失败。请尝试findQuarter(9),你得到两个结果。这太棒了!是的,尼娜非常熟练+1这很好,但我很难理解我们在做什么。你能解释一下吗?
(value + 12 - beginning) % 12
         ^^                   keep the result positive
              ^^^^^^^^^       take zero instead of a beginning
                         ^^^^ prevent number greater than 12
    // QUARTERS SOURCE
    var quarters = [
      { beginning: 11, end: 1 },
      { beginning: 2, end: 4 },
      { beginning: 5, end: 7 },
      { beginning: 8, end: 10 }
    ];

    // FUNCTION
    const findQuarter = (month) => quarters.find(q => q.beginning <= month && q.end < q.beginning ? q.end + 12 : q.end >= month)

    // TO TEST
    for(var i = 1; i < 12; i++) {
      console.log(`The month ${i} is in the quarter ${findQuarter(i).beginning} - ${findQuarter(i).end}`);
    }
    The month 1 is in the quarter 11 - 1
    The month 2 is in the quarter 2 - 4
    The month 3 is in the quarter 2 - 4
    The month 4 is in the quarter 2 - 4
    The month 5 is in the quarter 5 - 7
    The month 6 is in the quarter 5 - 7
    The month 7 is in the quarter 5 - 7
    The month 8 is in the quarter 8 - 10
    The month 9 is in the quarter 8 - 10
    The month 10 is in the quarter 8 - 10
    The month 11 is in the quarter 11 - 1