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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:28:10