在JSON对象数组中查找具有某些值的项并替换(如果存在)



我有一个这样的数组,它当然是动态的,当点击几个表单字段旁边的添加按钮时,每个元素都会被按下

[{"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

最新更新