Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 在JSON对象数组中查找具有某些值的项并替换(如果存在)_Jquery_Angular - Fatal编程技术网

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

Jquery 在JSON对象数组中查找具有某些值的项并替换(如果存在),jquery,angular,Jquery,Angular,我有一个这样的数组,它当然是动态的,当单击几个表单字段旁边的add按钮时,每个元素都会被按下 [{"EbudgetId":0,"CrId":0,"TypeId":"8","TypeName":"AUGMENT_STAFF","Year":2020,"Cost":456}, {"EbudgetId":0,"Cr

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

[{"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}]
我的要求是,如果某个特定类型和年份的项目已经存在,那么它应该添加其值,而不是将其放入数组中

出于这个目的,我确实喜欢这个,但它不起作用

  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和year,它也会作为新项添加到数组中

我做错了什么


我在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;
    }
    
  }

下面是函数
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(=>(u.TypeId==TypeId&&uId.Year==yr))

所以,这里你得到一个匹配对象的
数组
,如果它的
长度>0
你就得到了一些答案。因此,继续处理
foundItems

问题在于您的发现。您可以像这样使用
filter
来获取匹配的项目:

let foundItems=this.myChangeRequest.NewExternalBudget.filter(=>(u.TypeId==TypeId&&uId.Year==yr))
所以,这里你得到一个匹配对象的
数组
,如果它的
长度>0
你就得到了一些答案。因此,继续处理
foundItems