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

