我有一个这样的数组,它当然是动态的,当点击几个表单字段旁边的添加按钮时,每个元素都会被按下
[{"EbudgetId":0,"CrId":0,"TypeId":"8","TypeName":"AUGMENT_STAFF","Year":2020,"Cost":456},
{"EbudgetId":0,"CrId":0,"TypeId":"8","TypeName":"AUGMENT_STAFF","Year":2020,"Cost":456},
{"EbudgetId":0,"CrId":0,"TypeId":"8","TypeName":"AUGMENT_STAFF","Year":2020,"Cost":456},
{"EbudgetId":0,"CrId":0,"TypeId":"8","TypeName":"AUGMENT_STAFF","Year":2021,"Cost":657}]
我的要求是,如果已经存在特定类型和年份的Item,那么它应该添加其值,而不是推入数组。
出于这个目的,我确实喜欢这个,但它不起作用
addExternalBudget() {
let typeId:Number = this.selectedExternalBudget.TypeId;
let yr:number=this.selectedExternalBudget.Year;
if(typeId==0 || yr==0) return false;
let ebCopy: ExternalBudget = Object.assign({}, this.selectedExternalBudget);
let existingBudget:ExternalBudget=this.myChangeRequest.NewExternalBudget.find(x=>{x.TypeId===typeId;x.Year==yr});
if(existingBudget=== undefined){
this.myChangeRequest.NewExternalBudget.push(ebCopy);
}
else
{
existingBudget.Cost=this.selectedExternalBudget.Cost+existingBudget.Cost;
}
}
在这里,即使项目已经存在,并且具有给定的typeid和年份,它也会作为新项目添加到数组中。
我在这里做错了什么?
我在Angular 9 工作
下面是函数addExternalBudget
的外观。您的find
方法不正确,内部表达式不应该有大括号。如果它有大括号,则必须显式返回值-
addExternalBudget() {
let typeId:Number = this.selectedExternalBudget.TypeId;
let yr:number=this.selectedExternalBudget.Year;
if(typeId==0 || yr==0) return false;
let ebCopy: ExternalBudget = Object.assign({}, this.selectedExternalBudget);
let existingBudget:ExternalBudget=this.myChangeRequest.NewExternalBudget.find(x=> x.TypeId===typeId && x.Year==yr);
if(!existingBudget){
this.myChangeRequest.NewExternalBudget.push(ebCopy);
}
else
{
existingBudget.Cost=this.selectedExternalBudget.Cost+existingBudget.Cost;
}
}
问题在于您的发现。你可以像这样使用filter
来获得匹配的项目:
let foundItems = this.myChangeRequest.NewExternalBudget.filter( _ => (_.TypeId == typeId && _.Year == yr))
所以,这里你得到了一个匹配对象的array
,如果它是length > 0
,你会得到一些答案。所以继续处理foundItems
。