You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据array2开闭时间区间分组passArray并统计数量?

按开闭时间区间分组并统计Pass数量

问题描述

从API获取了两个数组:

passArray(记录Pass信息)

const passArray = [
  {pass_id: 645, heure_debut: '13:48:00', heure_fin: '14:48:00', createdAt:"2023-08-03T13:48:00.000Z"},
  {pass_id: 646, heure_debut: '14:40:00', heure_fin: '15:40:00', createdAt:"2023-08-03T14:40:00.000Z"},
  {pass_id: 647, heure_debut: '20:30:00', heure_fin: '21:30:00', createdAt:"2023-08-04T20:30:00.000Z"},
  {pass_id: 648, heure_debut: '13:00:00', heure_fin: '14:00:00', createdAt:"2023-08-04T13:00:00.000Z"},
  {pass_id: 649, heure_debut: '16:25:00', heure_fin: '17:25:00', createdAt:"2023-08-05T16:25:00.000Z"},
  {pass_id: 650, heure_debut: '18:30:00', heure_fin: '19:30:00', createdAt:"2023-08-05T18:30:00.000Z"}
];

array2(记录开闭时间)

const array2 = [
  {horaire_id: 5, operation: 'opened', user_id: 1, createdAt: '2023-08-03T12:15:46.000Z'},
  {horaire_id: 7, operation: 'closed', user_id: 1, createdAt: '2023-08-04T12:21:29.000Z'},
  {horaire_id: 8, operation: 'opened', user_id: 1, createdAt: '2023-08-04T12:29:04.000Z'},
  {horaire_id: 9, operation: 'closed', user_id: 1, createdAt: '2023-08-05T07:57:16.000Z'},
  {horaire_id: 10, operation: 'opened',user_id: 1, createdAt: '2023-08-05T08:04:48.000Z'},
  {horaire_id: 11, operation: 'closed',user_id: 1, createdAt: '2023-08-06T03:06:56.000Z'}
];

需求:根据array2中operation为opened和closed的时间区间,对passArray按createdAt分组,最终统计每个区间内的Pass数量。期望分组结果示例:

2023-08-03T12:15:46.000Z :
{pass_id: 645, heure_debut: '13:48:00', heure_fin: '14:48:00', createdAt:"2023-08-03T13:48:00.000Z"}
{pass_id: 646, heure_debut: '14:40:00', heure_fin: '15:40:00', createdAt:"2023-08-03T14:40:00.000Z"},

2023-08-04T12:29:04.000Z:
{pass_id: 647, heure_debut: '20:30:00', heure_fin: '21:30:00', createdAt:"2023-08-04T20:30:00.000Z"}
{pass_id: 648, heure_debut: '13:00:00', heure_fin: '14:00:00', createdAt:"2023-08-04T13:00:00.000Z"}

2023-08-05T07:57:16.000Z:
{pass_id: 649, heure_debut: '16:25:00', heure_fin: '17:25:00', createdAt:"2023-08-05T16:25:00.000Z"}
{pass_id: 650, heure_debut: '18:30:00', heure_fin: '19:30:00', createdAt:"2023-08-05T18:30:00.000Z"}

解决方案

步骤说明

  1. 整理开闭时间区间:从array2中提取成对的opened和closed时间,形成明确的时间区间数组。
  2. 分组Pass数据:使用reduce遍历passArray,将每个Pass匹配到对应的时间区间中。
  3. 统计数量:基于分组结果,直接获取每个区间内的Pass数量。

代码实现

// 1. 整理开闭时间区间
const intervals = [];
let currentOpened = null;

for (const item of array2) {
  if (item.operation === 'opened') {
    currentOpened = item.createdAt;
  } else if (item.operation === 'closed' && currentOpened) {
    intervals.push({
      start: currentOpened,
      end: item.createdAt
    });
    currentOpened = null;
  }
}

// 2. 分组Pass并统计数量
const result = passArray.reduce((acc, pass) => {
  const passTime = new Date(pass.createdAt);
  // 找到当前Pass所属的时间区间
  const interval = intervals.find(iv => {
    const start = new Date(iv.start);
    const end = new Date(iv.end);
    return passTime >= start && passTime <= end;
  });
  
  if (interval) {
    const key = interval.start;
    if (!acc[key]) {
      acc[key] = {
        passes: [],
        count: 0
      };
    }
    acc[key].passes.push(pass);
    acc[key].count += 1;
  }
  return acc;
}, {});

// 输出分组及统计结果
console.log('分组结果:');
for (const key in result) {
  console.log(`${key} :`);
  result[key].passes.forEach(p => console.log(p));
  console.log(`数量:${result[key].count}\n`);
}

代码解释

  • 整理区间:遍历array2,将连续的opened和closed时间配对成区间,确保每个区间有清晰的开始和结束节点。
  • reduce分组:reduce是分组统计的最优选择,它能高效累积结果。对每个Pass,用find匹配对应的时间区间,然后将Pass加入该区间的数组并更新计数。
  • 结果输出:最终result对象的键为区间的opened时间,对应值包含该区间内的所有Pass数据和统计数量。

内容的提问来源于stack exchange,提问作者ivory uchiwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:54:54