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

React中如何将JSON次日闭店时间关联至对应营业日展示

解决方案

核心思路是先预处理原始数据,把跨日期的open和close配对,生成包含完整时段(开始日、开始时间、结束日、结束时间)的数组,再基于这个数组渲染,全程无需修改原JSON。

步骤1:定义日期顺序与工具函数

先明确日期的先后顺序,避免处理时逻辑混乱;同时实现一个秒转时间的工具函数:

// 按时间先后定义日期顺序
const DAY_ORDER = ['friday', 'saturday', 'sunday'];
// 将秒数转换为HH:MM格式的时间字符串
const formatSecondsToTime = (seconds: number): string => {
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
};

步骤2:预处理数据,配对跨日期时段

写一个函数将原始JSON转换为带完整时段的数组:

interface RawHourEntry {
  type: 'open' | 'close';
  value: number;
}

interface ProcessedHourSlot {
  startDay: string;
  startTime: string;
  endDay: string;
  endTime: string;
}

const processBusinessHours = (rawData: Record<string, RawHourEntry[]>): ProcessedHourSlot[] => {
  const processedSlots: ProcessedHourSlot[] = [];
  // 存储未配对的open记录(用于跨日期匹配)
  const pendingOpens: { day: string; time: number }[] = [];

  DAY_ORDER.forEach(currentDay => {
    const entries = rawData[currentDay] || [];
    entries.forEach(entry => {
      if (entry.type === 'open') {
        // 遇到open先暂存,等待对应的close
        pendingOpens.push({ day: currentDay, time: entry.value });
      } else if (entry.type === 'close') {
        // 遇到close时,取出最近的未配对open,生成完整时段
        const lastOpen = pendingOpens.pop();
        if (lastOpen) {
          processedSlots.push({
            startDay: lastOpen.day,
            startTime: formatSecondsToTime(lastOpen.time),
            endDay: currentDay,
            endTime: formatSecondsToTime(entry.value),
          });
        }
      }
    });
  });

  return processedSlots;
};

步骤3:在React组件中渲染处理后的数据

替换原来的双层map逻辑,直接渲染预处理好的完整时段:

import React from 'react';

const BusinessHours = () => {
  // 原始营业时长JSON数据
  const rawHoursData = {
    friday: [{ type: "open", value: 36000 }],
    saturday: [{ type: "close", value: 3600 }, { type: "open", value: 36000 }],
    sunday: [{ type: "close", value: 3600 }, { type: "open", value: 43200 }, { type: "close", value: 75600 }]
  };

  // 预处理得到完整时段数组
  const processedSlots = processBusinessHours(rawHoursData);

  return (
    <div className="business-hours">
      {processedSlots.map((slot, index) => (
        <div key={index} className="hour-slot">
          <p className="hours">
            {slot.startDay.charAt(0).toUpperCase() + slot.startDay.slice(1)} {slot.startTime} - {slot.endDay.charAt(0).toUpperCase() + slot.endDay.slice(1)} {slot.endTime}
          </p>
        </div>
      ))}
    </div>
  );
};

export default BusinessHours;

最终效果

处理后会生成三个清晰的完整时段:

  • Friday 10:00 - Saturday 01:00
  • Saturday 10:00 - Sunday 01:00
  • Sunday 12:00 - Sunday 21:00

完美实现跨日期的时段关联展示,且未修改原始JSON文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:37:38