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

React中如何优雅修改数组指定对象的closeTime.hours属性?

优雅修改数组中指定对象的属性值

需求说明

目标是修改buildHours数组中openDay为TUESDAY的对象的closeTime.hours属性值,现有数组结构如下:

const buildHours = [
  {
    "openDay": "MONDAY",
    "openTime": {},
    "closeDay": "MONDAY",
    "closeTime": {
      "hours": 24
    }
  },
  {
    "openDay": "TUESDAY",
    "openTime": {
      "hours": 9
    },
    "closeDay": "TUESDAY",
    "closeTime": {
      "hours": 17
    }
  },
];

原实现方式的问题

原代码通过filter先移除目标对象、修改后再重新添加,流程繁琐:

const tempObject = buildHours.filter(i => i.openDay !== "TUESDAY"); // 移除周二对象
const tempHours = buildHours.filter(i => i.openDay === "TUESDAY")[0]; // 获取周二对象
tempHours.openTime.hours = e.value; // 注:原需求是修改closeTime.hours,此处疑似笔误
tempObject.push(tempHours); // 重新组合
console.log(tempObject);

更优雅的实现方案

filter的核心作用是筛选数组元素,并不适合直接用来修改元素属性。推荐以下两种更直接的方式:

1. 直接修改原数组(适合允许修改原数组的场景)

利用find方法快速定位目标对象,因为数组中的对象是引用类型,直接修改属性会同步到原数组:

const tuesdayItem = buildHours.find(item => item.openDay === "TUESDAY");
if (tuesdayItem) {
  // 按需求修改closeTime.hours
  tuesdayItem.closeTime.hours = e.value;
}

2. 生成新数组(不修改原数组,适合纯函数场景)

如果需要保留原数组不变,用map遍历生成新数组,对目标对象进行浅拷贝后修改属性:

const updatedBuildHours = buildHours.map(item => {
  if (item.openDay === "TUESDAY") {
    // 逐层浅拷贝,避免修改原对象的引用
    return {
      ...item,
      closeTime: {
        ...item.closeTime,
        hours: e.value
      }
    };
  }
  // 非目标对象直接返回原引用
  return item;
});

注意点

原代码中修改的是openTime.hours,但需求是修改closeTime.hours,需要注意修正这个逻辑差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:15:34