【问题标题】:Manage to merge two arrays depending in two values inside the object管理根据对象内的两个值合并两个数组
【发布时间】:2021-07-29 14:49:41
【问题描述】:

我在使用地图和条件时遇到了一个问题,基本上如示例所示,我有两个对象数组,我需要根据对象的两个属性来区分: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 个值将更新为各自的数量

提前感谢您的帮助

【问题讨论】:

  • if those two match, remove the item from preItem and add the item from addedItems这个要求不清楚
  • 基本上如果 item_variation_id 和 location_id 匹配,我需要将项目从 preItems 移动并将项目从 addeedItems 添加到 preItems

标签: javascript arrays sorting dictionary logic


【解决方案1】:

您可以只映射 preItems 数组,并在每次迭代中测试 addedItems 数组以进行匹配。如果存在,则返回 addeditems 匹配,否则返回 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)

【讨论】:

  • location_id 和 item_variation_id 与 3 个对象匹配,但您的函数只更新一个
  • 我更新了我的答案(需要修复)并更新了替换项目以使它们在答案中更加明显。
  • 非常感谢,你能告诉我为什么我的不工作吗: 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 ) : 项目) ]
  • b/c 您正在运行 2 个发现彼此分开。您想将它们一起运行,否则您将无法进行完全匹配
  • 标记为我的问题的答案。非常感谢
猜你喜欢
  • 2021-09-12
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多