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

如何用JavaScript函数式编程解析Google Places API营业时间数据

用JavaScript函数式编程转换Google Places营业时间数据

我来帮你搞定这个转换需求,完全用函数式编程的思路,纯函数、无副作用,一步到位。

先明确输入输出格式

首先咱们对齐一下数据结构:

  • 输入:Google Places API返回的periods数组,每个元素包含open和close对象,day是星期索引(0=周日,1=周一...6=周六),time是HHMM格式的字符串(比如"1100")
  • 输出:按周日到周六排序的openingHours数组,每个条目包含星期名称、是否营业、格式化后的营业时间数组

实现步骤与代码

1. 定义辅助工具函数

先写两个纯辅助函数,负责时间格式化和星期名称映射:

// 星期名称映射(对应Google的day索引:0=周日,1=周一...)
const dayNames = [
  "Sunday", "Monday", "Tuesday", "Wednesday",
  "Thursday", "Friday", "Saturday"
];

// 将HHMM格式的时间字符串转为HH:MM格式
const formatTime = (timeStr) => {
  return `${timeStr.slice(0, 2)}:${timeStr.slice(2)}`;
};

2. 核心转换函数(纯函数)

用reduce做分组,map做转换,完全符合函数式编程风格:

const convertToOpeningHours = (periods) => {
  // 第一步:按星期索引分组所有营业时段
  const periodsByDay = periods.reduce((acc, period) => {
    const dayIndex = period.open.day;
    // 如果当前星期还没有分组,初始化空数组
    if (!acc[dayIndex]) acc[dayIndex] = [];
    // 格式化时间后加入对应分组
    acc[dayIndex].push({
      open: formatTime(period.open.time),
      close: formatTime(period.close.time)
    });
    return acc;
  }, {});

  // 第二步:遍历一周7天,生成最终的营业时间数组
  return dayNames.map((dayName, dayIndex) => {
    // 获取当前星期的所有时段,没有的话就是空数组
    const dailyPeriods = periodsByDay[dayIndex] || [];
    return {
      day: dayName,
      isOpen: dailyPeriods.length > 0,
      hours: dailyPeriods.map(period => `${period.open}-${period.close}`)
    };
  });
};

3. 测试使用

把你的Google Places数据传进去就能得到想要的结果:

// 示例输入(对应你描述的营业规则)
const googlePeriods = [
  { open: { day: 1, time: "1100" }, close: { day: 1, time: "1400" } },
  { open: { day: 1, time: "1900" }, close: { day: 1, time: "2200" } },
  { open: { day: 2, time: "1100" }, close: { day: 2, time: "1400" } },
  { open: { day: 2, time: "1900" }, close: { day: 2, time: "2200" } },
  { open: { day: 3, time: "1100" }, close: { day: 3, time: "1400" } },
  { open: { day: 3, time: "1900" }, close: { day: 3, time: "2200" } },
  { open: { day: 4, time: "1100" }, close: { day: 4, time: "1400" } },
  { open: { day: 4, time: "1900" }, close: { day: 4, time: "2200" } },
  { open: { day: 5, time: "1100" }, close: { day: 5, time: "1400" } },
  { open: { day: 5, time: "1900" }, close: { day: 5, time: "2200" } },
  { open: { day: 6, time: "1100" }, close: { day: 6, time: "2200" } }
];

// 转换并输出结果
const openingHours = convertToOpeningHours(googlePeriods);
console.log(openingHours);

关键细节说明

  • 函数式特性:全程用纯函数,没有修改原输入的periods数组,所有操作都是返回新对象/数组,避免副作用
  • 周日处理:因为Google数据里没有day:0的条目,periodsByDay[0]会是undefined,我们用|| []兜底,所以周日的isOpen会是false,hours是空数组,完全符合需求
  • 扩展性:如果后续营业规则变化,只需要调整辅助函数或者分组逻辑,核心结构不用动

内容的提问来源于stack exchange,提问作者Herdís María Sigurðardóttir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:30:38