如何用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
相关产品推荐
相关产品推荐

