根据对象内部的两个值管理合并两个数组

Manage to merge two arrays depending in two values inside the object

我在使用映射和条件时遇到问题,基本上如示例所示,我有两个对象数组需要根据对象的两个属性进行区分:location_id 和 location_id.

const addedItems = [
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": 5,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 0,
    "action": "add_stock",
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": 8,
    "location_id": "loc_5MHY8nXyvSIqh2",
    "current_stock": -2,
    "action": "add_stock",
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": 15,
    "location_id": "loc_5BpxGVWA9g09vf",
    "current_stock": 0,
    "action": "add_stock",
  }
];

const preItems = [
  {
    "item_variation_id": "itemvar_O49yq8yCDC2v1N",
    "quantity": null,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 59,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_O49yq8yCDC2v1N",
    "quantity": null,
    "location_id": "loc_5MHY8nXyvSIqh2",
    "current_stock": 8,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_O49yq8yCDC2v1N",
    "quantity": null,
    "location_id": "loc_5BpxGVWA9g09vf",
    "current_stock": 1,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_duW8Yhhd4aT1iF",
    "quantity": null,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 27,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_duW8Yhhd4aT1iF",
    "quantity": null,
    "location_id": "loc_5MHY8nXyvSIqh2",
    "current_stock": 0,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_duW8Yhhd4aT1iF",
    "quantity": null,
    "location_id": "loc_5BpxGVWA9g09vf",
    "current_stock": -4,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": 5,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 0,
    "action": "add_stock",
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": null,
    "location_id": "loc_5MHY8nXyvSIqh2",
    "current_stock": -2,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": null,
    "location_id": "loc_5BpxGVWA9g09vf",
    "current_stock": 0,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_YASfOt2B6B4ixE",
    "quantity": null,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 0,
    "action": "",
  }
]

const findItem = (id) => addedItems.find( itemData => itemData.item_variation_id === id )

const updatedItems = [...preItems.map( item => 
( item.item_variation_id === findItem(item.item_variation_id)?.item_variation_id && 
  item.location_id === findItem(item.item_variation_id)?.location_id 
) ? findItem(item.item_variation_id) : item
)  ]

console.log(updatedItems)

综上所述,我想得到的是,

first: compare the two arrays (addeedItems and preItems)
second: match these keys while iterating: item_variation_id and location_id
third: if those two match values(item_variation_id and location_id) matches while iterating, remove the item from preItem and add the item from addedItems

总而言之,我的函数 updatedItems 只删除了一项,预期的输出应该移动 3 项。所以输出将是 3 个值将更新为各自的数量

提前感谢您的帮助

您可以只映射 preItems 数组,并在每次迭代中测试 addedItems 数组是否匹配。如果它在那里,return addeditems 匹配,否则 return preItems 匹配。有几种方法可以做到这一点。我用了 array.prototype.find

let updated = preItems.map(p => {
      let b = addedItems.find(a => a.location_id === p.location_id && a.item_variation_id === p.item_variation_id);
      return b ? b : p;
    });

const addedItems = [{
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": 5,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 0,
    "action": "add_stock",
    "xtra": " ADDED1!!!"
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": 8,
    "location_id": "loc_5MHY8nXyvSIqh2",
    "current_stock": -2,
    "action": "add_stock",
    "xtra": " ADDED2!!!"
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": 15,
    "location_id": "loc_5BpxGVWA9g09vf",
    "current_stock": 0,
    "action": "add_stock",
    "xtra": " ADDED3!!!"
  }
];

const preItems = [{
    "item_variation_id": "itemvar_O49yq8yCDC2v1N",
    "quantity": null,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 59,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_O49yq8yCDC2v1N",
    "quantity": null,
    "location_id": "loc_5MHY8nXyvSIqh2",
    "current_stock": 8,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_O49yq8yCDC2v1N",
    "quantity": null,
    "location_id": "loc_5BpxGVWA9g09vf",
    "current_stock": 1,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_duW8Yhhd4aT1iF",
    "quantity": null,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 27,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_duW8Yhhd4aT1iF",
    "quantity": null,
    "location_id": "loc_5MHY8nXyvSIqh2",
    "current_stock": 0,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_duW8Yhhd4aT1iF",
    "quantity": null,
    "location_id": "loc_5BpxGVWA9g09vf",
    "current_stock": -4,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": 5,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 0,
    "action": "add_stock",
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": null,
    "location_id": "loc_5MHY8nXyvSIqh2",
    "current_stock": -2,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_QQWn8cQxq7TnB6",
    "quantity": null,
    "location_id": "loc_5BpxGVWA9g09vf",
    "current_stock": 0,
    "action": "",
  },
  {
    "item_variation_id": "itemvar_YASfOt2B6B4ixE",
    "quantity": null,
    "location_id": "loc_r91C120vrwlReF",
    "current_stock": 0,
    "action": "",
  }
]
let updated = preItems.map(p => {
  let b = addedItems.find(a => a.location_id === p.location_id && a.item_variation_id === p.item_variation_id);
  return b ? b : p;
});

console.log(updated)