javascript - 检查数组以找到相等的 id

标签 javascript

我有一个产品列表,例如:

listOfProducts = [{name: "prod1", productId: 1}, {name:"prod2", productId: 2},.....]

如果我选择一个产品,我将填充数组

listSelectedProducts

它将包含所选的产品。

我发了一篇文章来保存我的选择。

现在,如果我返回产品页面,我将得到一个数组:

oldProductsArray

其中包含我保存在数据库中的产品。

listSelectedProducts

与我选择的产品。

现在,如果我删除所选产品以选择另一个产品,我的 oldProductsArray 将选择第一个产品,但 listSelectedProducts 将选择新产品。

所以现在我应该从数据库中删除我不再想要的产品(它位于 oldProductsArray 中)。所以我想比较(我有我的问题)两个数组,如果 oldProductsArray 中的元素不在 listSelectedProducts 中,我将创建一个新数组,其中包含未选择的产品以删除它们。

让我们举个例子:

我在我的产品页面中选择了一个产品。

所以listSelectedProducts = [{name: "prod1", ProductId: 1}]

我会在数据库中发布。

我返回产品页面,这次我有:

listSelectedProducts = [{name: "prod1", productId: 1}]
oldProductsArray = [{name: "prod1", productId: 1}]

我取消选择产品:prod1 并选择产品:prod2

所以我有:

listSelectedProducts = [{name: "prod2", productId: 2}]
oldProductsArray = [{name: "prod1", productId: 1}]

现在我应该检查 oldProductsArray 中的产品是否也在 listSelectedProducts 中,如果是,我可以发布帖子,如果不是(就像在本例中),我应该从数据库中删除该产品。

所以我有一个功能:

this.checkOldProduct(oldProductsArray, listSelectedProducts)

在此函数中:

checkOldProduct(oldProductsArray, listSelectedProducts){
let arrayProductToDelete = []
// i have tried like this, but it doesn't work properly.
listSelectedProducts.filter(p1 => !oldProducts.some(p2 => { p1.productId === p2.productId, arrayProductToDelete.push(p2) }));
}

我希望我已经表达得很好,无论如何我准备补充说明。谢谢

最佳答案

首先快速考虑一下:

  1. 如果这确实是产品列表的所有数据,您可能应该在 API 上使用 PUT 方法,然后简单地替换整个列表,而无需计算差异
  2. 如果您仍然需要进行单独的操作来更新产品列表,我想您应该发出 POST 请求来添加新项目,DELETE 请求来删除项目,以及 PATCH 请求更新单个项目(例如相同的 ID,但数量不同?)
  3. 从上面的观点来看:你们还有商品的数量吗?

问题具体答案

因此,仅根据您的问题,我认为最简单的方法是找到要删除的项目列表,如下所示:

const removedItems = oldArray.filter((old) => !newArray.find((_new) => old.id === _new.id));

并请求删除它们。

完整差异答案

如果您想计算图表项目的完整差异,以便可以发出多个更新请求,您可以执行以下操作:

function arrayDiff(oldArray, newArray) {
  const addedAndUpdatedItems = newArray.reduce((diff, item, index, array) => {
    const oldItem = oldArray.find((old) => old.id === item.id);
    if(!oldItem) {
      diff.added.push(item);
    } else if(oldItem.quantity !== item.quantity) {
      diff.updated.push(item);
    }
    return diff;
  }, {
    added: [],
    updated: []
  });
  const removedItems = oldArray.filter((old) => !newArray.find((_new) => old.id === _new.id));
  return {
    ...addedAndUpdatedItems,
    removed: removedItems
  }
}

const oldArray = [{ name: "prod1", id: 1, quantity: 1 }, { name: "prod3", id: 3, quantity: 4 }];
const newArray = [{ name: "prod1", id: 1, quantity: 3 }, { name: "prod2", id: 2, quantity: 3 }];

const diff = arrayDiff(oldArray, newArray);

console.log({ diff });

输出为

{
    "added": [
        {
            "name": "prod2",
            "id": 2,
            "quantity": 3
        }
    ],
    "updated": [
        {
            "name": "prod1",
            "id": 1,
            "quantity": 3
        }
    ],
    "removed": [
        {
            "name": "prod3",
            "id": 3,
            "quantity": 4
        }
    ]
}

关于javascript - 检查数组以找到相等的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73501873/

相关文章:

javascript - 在 EmberJS 中,外部 JS 文件应该放在哪里?

javascript - 模式对话框内的按钮不起作用

javascript - 如何调用具有动态参数数量的构造函数?

javascript - 使用 Phonegap 下载文件时 iOS 应用程序崩溃

javascript - 使用javascript验证数字输入

javascript - 更改局部变量的值执行原始全局变量值的更改

javascript - Angular URL 标记

javascript - 在 NgbTooltip 内容中包含超链接(带有 _blank 目标)属性

javascript - 如何在 React-Native 中将按下事件从内部 Touchable 冒泡到外部 Touchable?

javascript - 在谷歌地图 v3 上更改多段线描边颜色