angular - 如何在 Angular/Typescript 中更新 KeyValue 数组的值
问题描述
我正在使用 Angular/Typescript,我有来自 API 的 JSON 响应
{
"ID": 34397,
"AssignedWorkers": {
"Job1": 1,
"Job2": 7,
"Job3": 2,
"Job4": 1,
"Job5": 1,
"Job6": 6,
"Job7": 9,
"JobN": 2
}
}
这些工作是动态的,可以返回任何名称。为此,我定义了以下接口:
export interface Deck {
ID: number;
AssignedWorkers: Jobs[];
}
export interface Jobs {
[Job:string]: number;
}
我可以获得每个工作的价值,但我无法改变特定工作的价值。
更新对象的函数是这样的:
updateJob(Job:string,Workers:number): void {
for (var property in this.objOffice.Jobs) {
if (property === Job) {
this.objOffice.Jobs[property] = Workers;
}
}
}
错误是这样的:类型“数字”不可分配给类型“工作”
如果我只知道作业的名称,如何更改作业的值?
解决方案
Deck
如果您与 API 响应进行比较,您的接口定义似乎有一个小错误。
您的 API 包含一个数字字典,但在您的界面中,您将 Jobs 定义为一个数组。
假设 API 响应是您想要建模的,我相信这是正确的接口:
interface Deck {
ID: number;
AssignedWorkers: Jobs
}
interface Jobs {
[Job:string]: number
}
其次,我认为稍微重写您的函数可能会更有益,以便它接受将要变异的对象的副本,否则您将无法使用该函数,除非那个硬编码引用。
使用 Copy,避免突变
updateJob(deck: Deck, entry: string, worker: number): Deck {
// optionally create a copy to avoid unexpected mutations
const updatedJobs = {...deck, AssignedWorkers: {...deck.AssignedWorkers}};
if(entry in updatedJobs.AssignedWorkers) updatedJobs.AssignedWorkers[entry] = worker;
return updatedJobs
}
用法
this.currentJobs = this.updateJob(this.currentJob, "Job1", 10);
没有复制,导致突变
updateJob(entry: string, worker: number) {
if(entry in this.jobs.AssignedWorkers)
jobs.AssignedWorkers[entry] = worker;
}
推荐阅读
- elixir - Escript 文件和 .gitignore
- python - 用于验证 json 文件内容的函数的 Pytest
- unicode - 汉字的Unicode范围(最小可行)
- android - 无效的集合引用。集合引用必须有奇数个段
- pandas - 初始熊猫数据框中每年的分组最大值
- compare - diff vs rsync 用于比较目录
- javascript - Google Map fliker 如何在更新标记位置上删除
- amazon-web-services - 状态码:404,响应:{"message":" ...不是有效的 BotId/BotAliasId 组合。"}
- javascript - 如何在脚本中增加 Dom 元素的边距?
- sql - 连接 2 个表,其中一个是特定列,另一个是字符串?