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

TypeScript中如何依据数组更新嵌套对象的属性值?

问题解决:无法更新对象属性值

原始数据与需求

原始数据对象(外层键为数据库ID):

{
   b954WYBCC4YbsMM36trawb00xZ32: { activity1: "pending", activity2: "pending" },
   pby0CAqQ1hTlagIqBTQf6l2Ti9L2: { activity1: "pending", activity2: "pending" }
}

需求:依据数组usersHaveSpecialContentAssigned更新属性值,当数组对应位置为false时,将该用户的activity1和activity2改为"unassigned",期望结果:

{
   b954WYBCC4YbsMM36trawb00xZ32: { activity1: "pending", activity2: "pending" },
   pby0CAqQ1hTlagIqBTQf6l2Ti9L2: { activity1: "unassigned", activity2: "unassigned" }
}

当前代码的问题

原代码无法生效的核心原因:

  • Object.values(item)返回的是对象属性值的浅拷贝数组,遍历这个数组时,progress只是值的副本,修改progress不会影响原对象的属性。
  • 类型断言item as string[]错误,item是包含activity1和activity2的对象,不是字符串数组。

修正后的代码

方案1:遍历属性名直接修改原对象(通用型,适配任意属性名)

// 'data' 为原始对象
const usersHaveSpecialContentAssigned = [true, false];

Object.values(data).forEach((item, index) => {
    if (!usersHaveSpecialContentAssigned[index]) {
        // 遍历当前用户对象的所有属性名,直接修改原对象属性
        Object.keys(item).forEach(key => {
            item[key] = 'unassigned';
        });
    }
});

方案2:直接指定属性名修改(已知固定属性名时更高效)

// 'data' 为原始对象
const usersHaveSpecialContentAssigned = [true, false];

Object.values(data).forEach((item, index) => {
    if (!usersHaveSpecialContentAssigned[index]) {
        item.activity1 = 'unassigned';
        item.activity2 = 'unassigned';
    }
});

说明

两种方案都是直接操作原始用户对象的属性,而非操作值的副本,因此修改会直接同步到原始data对象中,达到预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:25:18