【问题标题】:Given two array create another one with only different element给定两个数组创建另一个只有不同元素的数组
【发布时间】:2022-11-17 19:14:55
【问题描述】:

我有两个数组:

例如:

arraySelectedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]
arraySavedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]

现在我需要检查 arraySavedItems 中是否有一些项目不存在于 arraySelectedItems 中,在这种情况下,我将去填充另一个名为 arrayDeletedItems 的数组。

如果两个数组具有相同的项目,我不需要填充 arrayDeletedItems。

所以我试过这段代码:

arraySavedItems.filter((itemSaved) => !arraySelectedItems.find((itemSel) => {
  if (itemSaved.id !== itemSel.id) {
    arrayDeletedItems.push(itemSaved)
  }
}
))

所以有了这个数据:

 arraySelectedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]
 
 arraySavedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]

我希望 arrayDeletedItems 将是:

 arrayDeletedItems = []

取而代之的是这个数据,例如:

 arraySelectedItems = [{id: 1, name: "item1"}]

 arraySavedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]

我希望 arrayDeletedItems 将是:

arrayDeletedItems = [{id: 2, name: "item2"}]

使用我的代码,我收到了具有所有值的 arrayDeletedItems:

arrayDeletedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]

【问题讨论】:

  • 只是为了澄清出了什么问题。您的代码检查是否有任何 ID 不匹配,然后添加。问题是它将遍历数组中的所有项目。在你最后一个有 1 个选定项目和 2 个保存项目的例子中,它会循环并在第一次迭代中这样说: itemSaved.id (value:1) = itemSel.id(value:1) 意味着它不会进入 if陈述。现在它将转到 itemSaved 编号 2。现在您将看到 itemSaved.id(value:2) = itemSel.id(value:1)。这将进入 if 语句,因为值不相等
  • 是的,我已经在调试器中尝试过并注意到这一点。无论如何谢谢你的解释:)

标签: javascript angular


【解决方案1】:

考虑这个通用函数:

function difference(a, b, keyFn) {
    let keys = new Set(a.map(keyFn))
    return b.filter(obj => !keys.has(keyFn(obj)))
}


//


selectedItems = [{id: 1, name: "item1"}, {id:4}]

savedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}, {id:3}, {id:4}]

result = difference(selectedItems, savedItems, obj => obj.id)

console.log(result)

【讨论】:

  • 好东西!谢谢 :)
【解决方案2】:

您可以在数组上使用 .includes() 方法来检查其中是否包含一个值(有关更多信息,请参阅 documentation)。

现在我们可以过滤已保存项目的数组,以仅查找未包含在所选项目数组中的项目。

arrayDeletedItems = arraySavedItems.filter((itemSaved) => 
  !arraySelectedItems.includes(itemSaved)
)

【讨论】:

  • 这种方法的问题是您不能将对象与另一个对象进行比较,因为它将通过引用进行比较,而不是通过它的键/值进行比较。 includes 适用于原始数据类型,但我认为它不适用于对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多