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