angular - 更改嵌套对象的属性值 Angular 4+
问题描述
我正在尝试创建一个动态嵌套对象,但我无法更改我正在创建的属性的值
TS
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
name = 'Test 1';
expectedResult = {
"0": { test: "Whoever" },
"1": { test: "Whoever" },
"2": { test: "Whoever" },
"3": { test: "Whoever" },
"4": { test: "Whoever" },
"5": { test: "Whoever" },
"6": { test: "Whoever" },
"7": { test: "Whoever" },
};
obj = <any>{};
test() {
for (var i = 0; i <= 7; i++) {
// how do i write this line
this.obj[i].test = "Whoever" //<-------------------------
}
}
}
html
<hello name="{{ name }}"></hello>
<button class="btn btn-sm btn-outline-primary" (click)="test()">
Test me</button>
<pre>
{{obj|json}}
</pre>
<pre>
{{expectedResult|json}}
</pre>
添加 stackblitz 以供参考。
https://stackblitz.com/edit/mavvtogotest
编辑
谢谢大家帮忙,(对不起)也许我解释得不好。该解决方案必须适用于多个嵌套对象示例:
expectedResult = {
"0": {
"0": {
"0": { "test": "Whoever" },
"1": { "test": "Whoever" },
"2": { "test": "Whoever" }
},
"1": {
"0": { "test": "changeMe","notToBeChanged":"oldValue" },
"1": { "test": "changeMe","notToBeChanged":"oldValue" },
"2": { "test": "changeMe","notToBeChanged":"oldValue" }
},
"2": {
"0": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"1": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"2": { "test": "changeMe" ,"notToBeChanged":"oldValue" }
}
},
"1": {
"0": {
"0": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"1": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"2": { "test": "changeMe" ,"notToBeChanged":"oldValue" }
},
"1": {
"0": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"1": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"2": { "test": "changeMe" ,"notToBeChanged":"oldValue" }
},
"2": {
"0": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"1": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"2": { "test": "changeMe" ,"notToBeChanged":"oldValue" }
}
},
"2": {
"0": {
"0": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"1": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"2": { "test": "changeMe" ,"notToBeChanged":"oldValue" }
},
"1": {
"0": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"1": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"2": { "test": "changeMe" ,"notToBeChanged":"oldValue" }
},
"2": {
"0": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"1": { "test": "changeMe" ,"notToBeChanged":"oldValue" },
"2": { "test": "changeMe" ,"notToBeChanged":"oldValue" }
}
}
};
解决方案
如果您看到控制台,您会在那里看到此错误
TypeError:无法设置未定义的属性“测试”
这意味着当你在做this.obj[i].test
,this.obj[i]
是未定义的。解决问题使用下面的代码。我也让你obj
打字以获得类型检查的好处。
obj : {[key:string]: {test: string}} = {};
test() {
for (var i = 0; i <= 7; i++) {
// how do i write this line
this.obj[i] = { test : "Whoever" }
}
}
根据评论更新
如果您想更新 obj 上的现有项目,您可以使用下面的代码,因此如果那里还有其他属性,它也不会覆盖
解决方案 1
this.obj[i] = Object.assign({} ,this.obj[i], { test : "Whoever" });
解决方案 2
if (this.obj[i] == null) { this.obj[i] = {};}
this.obj[i].test = "Whoever";
推荐阅读
- java - 如何在spring-jpa中使用@GeneratedValue获取序列中的下一个值
- python - 如何计算两列内两组数据之间的相关性?
- docker - Docker build 找不到 G++,手动运行该步骤有效
- database - Flutter App,管理员必须在上传之前确认图片
- r - 按月划分范围和聚合日期中的列值以计算该月范围内的频率
- tmux - Tmuxconf 被禁用但我写在正确的地方正确的 lint
- c# - 如何检查宾果游戏?
- python - 与熊猫约会
- laravel - 如何通过路由将我的视图映射到控制器?
- r - 'names' 属性 [1] 必须与向量 [0] 的长度相同