JavaScript:如何在不修改原对象的前提下调整跨天营业时间数据?
如何在不修改原对象的前提下,将跨日期的营业时间归位到对应日期键下
现有一个存储门店一周营业开闭时间的对象,其中friday的close时间在saturday数组里,saturday的close时间在sunday数组里。原代码用splice和push能实现时间归位,但会直接修改原对象,不符合需求。下面提供两种不修改原对象的实现方案:
原数据结构
const days = { "monday": [{ "day": "monday", "type": "open", "value": 43200 }, { "day": "monday", "type": "close", "value": 75600 } ], "tuesday": [{ "day": "tuesday", "type": "open", "value": 43200 }, { "day": "tuesday", "type": "close", "value": 75600 } ], "wednesday": [{ "day": "wednesday", "type": "open", "value": 43200 }, { "day": "wednesday", "type": "close", "value": 75600 } ], "thursday": [{ "day": "thursday", "type": "open", "value": 43200 }, { "day": "thursday", "type": "close", "value": 75600 } ], "friday": [{ "day": "friday", "type": "open", "value": 36000 }], "saturday": [{ "day": "friday", "type": "close", "value": 3600 }, { "day": "saturday", "type": "open", "value": 36000 } ], "sunday": [{ "day": "saturday", "type": "close", "value": 3600 }, { "day": "sunday", "type": "open", "value": 43200 }, { "day": "sunday", "type": "close", "value": 75600 } ] }
方案一:基于深拷贝处理
先复制原对象的完整副本,所有操作都在副本上进行,完全不影响原数据:
// 创建原对象的深拷贝,避免修改原数据 const daysCopy = JSON.parse(JSON.stringify(days)); const result = Object.entries(daysCopy).map(([key, times]) => { // 复制当前日期的时间数组,不直接修改原数组 let updatedTimes = [...times]; if (key === 'friday') { // 从saturday里找到friday的close时间并添加 const fridayClose = daysCopy.saturday.find(item => item.day === 'friday'); if (fridayClose) { updatedTimes = [...updatedTimes, fridayClose]; } // 过滤saturday数组,只保留属于它自己的时间 daysCopy.saturday = daysCopy.saturday.filter(item => item.day === 'saturday'); } else if (key === 'saturday') { // 从sunday里找到saturday的close时间并添加 const saturdayClose = daysCopy.sunday.find(item => item.day === 'saturday'); if (saturdayClose) { updatedTimes = [...updatedTimes, saturdayClose]; } // 过滤sunday数组,只保留属于它自己的时间 daysCopy.sunday = daysCopy.sunday.filter(item => item.day === 'sunday'); } return { [key]: updatedTimes }; }); console.log(result); // 验证原对象未被修改:输出1,原friday数组长度不变 console.log(days.friday.length);
方案二:直接构建新结果对象
无需拷贝原对象,直接根据原数据筛选、拼接出目标结构,逻辑更直观:
const result = {}; // 处理周一到周四:直接复制原数据 ['monday', 'tuesday', 'wednesday', 'thursday'].forEach(day => { result[day] = [...days[day]]; }); // 处理周五:原周五时间 + 周六数组里的周五close result.friday = [ ...days.friday, ...days.saturday.filter(item => item.day === 'friday') ]; // 处理周六:周六数组里的周六时间 + 周日数组里的周六close result.saturday = [ ...days.saturday.filter(item => item.day === 'saturday'), ...days.sunday.filter(item => item.day === 'saturday') ]; // 处理周日:只保留周日数组里属于周日的时间 result.sunday = days.sunday.filter(item => item.day === 'sunday'); console.log(result); // 验证原对象未被修改:原周六数组依然包含周五的close时间 console.log(days.saturday);
内容的提问来源于stack exchange,提问作者Chris G
相关产品推荐
相关产品推荐

