Typescript 更新已存在的数组并将新数据推送到同一数组中

Typescript 更新已存在的数组并将新数据推送到同一数组中,typescript,Typescript,我想将一个数组的值推送到另一个数组中,但在推送数据的同时,如果已经存在可用的数据,它应该只更新现有数据。 代码是用typescript编写的 截至目前,输出为: *更新前的数组: 苹果-3 番茄-4 果酱-1 更新后的数组: 苹果-3 番茄-4 果酱-1 橙色--3 番茄-8 葡萄-20* 但我希望输出为: *更新前的数组: 苹果-3 番茄-4 果酱-1 更新后的数组: 苹果-3 西红柿-12 果酱-1 橙色--3 葡萄-20* 如何更改代码以获得所需的输出?我对代码进行了一些更改,并得到了

我想将一个数组的值推送到另一个数组中,但在推送数据的同时,如果已经存在可用的数据,它应该只更新现有数据。 代码是用typescript编写的



截至目前,输出为: *更新前的数组: 苹果-3 番茄-4 果酱-1

更新后的数组: 苹果-3 番茄-4 果酱-1 橙色--3 番茄-8 葡萄-20*

但我希望输出为: *更新前的数组: 苹果-3 番茄-4 果酱-1

更新后的数组: 苹果-3 西红柿-12 果酱-1 橙色--3 葡萄-20*


如何更改代码以获得所需的输出?

我对代码进行了一些更改,并得到了所需的答案,但不确定这是否是最佳解决方案。如果有人有更好的解决方案,请张贴您的答案


类项目列表{
构造函数(公共名称:字符串,公共金额:数字){}
}
函数disar(Ar1:itemList[]{
用于(Ar1的出租项目){
console.log(item.name+“--”+item.amount);
}
}
var Ar1=[new itemList('Apple',3),
新项目列表(“番茄”,4),
新项目列表(“Jam”,1)];
var Ar2=[new itemList('Orange',3),
新项目列表(“番茄”,8),
新项目列表(“葡萄”,20)];
log(“更新前的数组:”);
disar(Ar1);
var delAr=[];

对于(设i=0;i我的方法是创建一个新函数
addtoArray或incrementAmount
,它接受一个要修改的数组(
contextArray
)和一个要添加的新值数组(
newArray

对于
newArray
中的每个项目,使用
.name
属性作为标识符(应为唯一id),检查该项目是否存在于
contextArray
中。如果该标识符不存在,则推送一个新项目,否则使用
+=
修改/增加
金额
值。调用此新函数,如
addToArrayOrIncrementAmount(Ar1,Ar2)

类项目列表{
构造函数(公共名称:字符串,公共金额:数字){}
}
函数disar(Ar1:itemList[]{
用于(Ar1的出租项目){
console.log(item.name+“--”+item.amount);
}
}
函数addToArrayOrIncrementAmount(contextArray:itemList[],newArray:itemList[]){
newArray.forEach(产品=>{
const index=contextArray.findIndex((e)=>e.name==product.name);
如果(索引==-1){
contextArray.push(产品);
}否则{
contextArray[index].amount+=product.amount;
}
});
}
var Ar1=[new itemList('Apple',3),
新项目列表(“番茄”,4),
新项目列表('Jam',1)
];
var Ar2=[new itemList('Orange',3),
新项目列表(“番茄”,8),
新项目列表('Grape',20)
];
log(“更新前的数组:”);
disar(Ar1);
增加或增加金额(Ar1、Ar2);
log(“更新前的数组:”);
disar(Ar1);
在这里,它是一个JavaScript版本,这样我就可以插入到答案中,并能够通过单击“运行代码片段”来演示它的工作原理

类项目列表{
建造商(名称、金额){
this.name=名称;
这个。金额=金额;
}
}
功能解除(Ar1){
用于(Ar1的出租项目){
console.log(item.name+“--”+item.amount);
}
}
函数addToArrayOrIncrementAmount(contextArray,newArray){
newArray.forEach(产品=>{
const index=contextArray.findIndex((e)=>e.name==product.name);
如果(索引==-1){
contextArray.push(产品);
}否则{
contextArray[index].amount+=product.amount;
}
});
}
var Ar1=[new itemList('Apple',3),
新项目列表(“番茄”,4),
新项目列表('Jam',1)
];
var Ar2=[new itemList('Orange',3),
新项目列表(“番茄”,8),
新项目列表('Grape',20)
];
log(“更新前的数组:”);
disar(Ar1);
增加或增加金额(Ar1、Ar2);
log(“更新前的数组:”);

DisArr(Ar1);
我有另一个解决方案,使用
减少
方法并删除Ar2和
中的重复项,如下所示

let result = Ar1.reduce((acc, item) => {
      let found = Ar2.find(c => c.name == item.name);
      if (found != undefined) {
        item.amount += found.amount;
        const index = Ar2.indexOf(found);
        if (index > -1) {
          Ar2.splice(index, 1);
        }
      }
      acc.push(item);
      return acc;
    }, []);

    result = result.concat(Ar2);
stackbliz演示

class itemList{
    constructor(public name: string, public amount: number){}
}

function DisArr(Ar1: itemList[]){
    for(let item of Ar1){
        console.log(item.name + " -- " + item.amount);
    }
}

var Ar1 = [new itemList('Apple',3),
new itemList('Tomato',4),
new itemList('Jam',1)];

var Ar2 = [new itemList('Orange',3),
new itemList('Tomato',8),
new itemList('Grape',20)];

console.log("Array before updating : ");
DisArr(Ar1);

var delAr = [];
for(let i=0; i<Ar2.length; i++){
    for(let obj of Ar1){
        if(obj.name === Ar2[i].name){
            obj.amount += Ar2[i].amount;
            delAr.push(i);
        }
    }
}
for(let no of delAr){
    Ar2.splice(no,1);
}
Ar1.push(...Ar2);


console.log("Array before updating : ");
DisArr(Ar1);
---
let result = Ar1.reduce((acc, item) => {
      let found = Ar2.find(c => c.name == item.name);
      if (found != undefined) {
        item.amount += found.amount;
        const index = Ar2.indexOf(found);
        if (index > -1) {
          Ar2.splice(index, 1);
        }
      }
      acc.push(item);
      return acc;
    }, []);

    result = result.concat(Ar2);