首页 > 解决方案 > 打字稿合并2个数组并增加数量,如果它们具有相同的ID

问题描述

我正在处理我的 Angular 8 项目,如果它们在对象中具有相同的值,我想将 2 个数组合并为 1 个并增加 qty。我自己尝试了几次,但效果并不好。

mergedOrderList: any[]= [];

lstOldOrder: any[] = [
{id: "", products_id: "", qty: 1, ...},
{id: "", products_id: "", qty: 1, ...},
{id: "", products_id: "", qty: 1, ...},];

lstNewOrder: any[] = [
{id: "", products_id: "", qty: 1, ...},
{id: "", products_id: "", qty: 1, ...},
{id: "", products_id: "", qty: 1, ...},];

lstNewOrder.forEach(newOrder => {

    let isDubplicated: boolean = false;

    lstOldOrder.forEach(oldOrder => {

      if (newOrder.products_id == oldOrder.products_id) {
        oldOrder.qty += newOrder.qty;
        isDubplicated = true;
        mergedOrderList.push(oldOrder);
      }
    });

    if (!isDubplicated) {
      mergedOrderList.push(newOrder)
    }

  });

我确实喜欢这样,并且当它们都具有相同的 products_id 时它们可以工作。但是当新订单没有 products_id 时。他们跳过我的旧订单,只将新订单添加到列表中。我不太确定我做对了。谢谢

标签: arraysangulartypescript

解决方案


看到的问题是,如果 新列表项与旧列表中的任何项匹配,您只会从lstOldOrderin添加数据。mergedOrderListproduct_id

因此,如果所有项目都是新的,您将无法从旧列表中看到任何项目lstNewOrder

相反,您应该做的是:

将项目添加到,mergedOrderList但如果匹配则增加数量。

mergedOrderList = [];

lstOldOrder = [
  { id: "1", products_id: "", qty: 1 },
  { id: "2", products_id: "", qty: 1 },
  { id: "3", products_id: "", qty: 1 },
];

lstNewOrder = [
  { id: "4", products_id: "", qty: 1 },
  { id: "5", products_id: "", qty: 1 },
  { id: "1", products_id: "", qty: 1 },
];

lstNewOrder.forEach((newOrder) => {
  Oindex = -1;
  lstOldOrder.forEach((item, index) => {
    if (item.id == newOrder.id) {
      Oindex = index; // Getting the Index of that item in old array.
    }
  });

  if (Oindex != -1) { // if that item was in old Array
    newOrder.qty += lstOldOrder[Oindex].qty; // Increase Quantity in newOrderItem
    lstOldOrder.splice(Oindex, 1); // Delete that Item from OldArray
  }
  mergedOrderList.push(newOrder); // Add the Item in Merged
});

mergedOrderList.concat(lstOldOrder); // Finally add all the remaining Items

代码中的所有边缘情况都没有得到正确处理,对此感到抱歉。随意编辑我的答案,它可能会帮助别人


推荐阅读