有没有一种方法可以判断一个对象数组是否有与另一个对象数组相同的元素,以及该对象的交集是什么?(如CONTAINS函数)。在下面的示例中,对象数组1中的ProductId3也包含在对象数组2中。
我在考虑使用Double for循环。然而,有没有一种更有效/更优的方法,或者是简写的ECMA或Lodash函数?
array1.forEach(arr1 => {
array2.forEach(arr2 => {
if (arr1.productId === arr2.productId &&
arr1.productName === arr2.productName ...
检查所有对象成员,而不仅仅是ProductID
对象数组1:
[
{
ProductId: 50,
ProductName: 'Test1',
Location: 77,
Supplier: 11,
Quantity: 33
},
{
ProductId: 3,
ProductName: 'GHI',
Location: 1,
Supplier: 4,
Quantity: 25
}
]
对象数组2:
[
{
ProductId: 1,
ProductName: 'ABC',
Location: 3,
Supplier: 4,
Quantity: 52
},
{
ProductId: 2,
ProductName: 'DEF',
Location: 1,
Supplier: 2,
Quantity: 87
},
{
ProductId: 3,
ProductName: 'GHI',
Location: 1,
Supplier: 4,
Quantity: 25
},
{
ProductId: 4,
ProductName: 'XYZ',
Location: 5,
Supplier: 6,
Quantity: 17
}
]
资源:
How to determine if Javascript array contains an object with an attribute that equals a given value?
Javascript: Using .includes
to find if an array of objects contains a specific object
7条答案
按热度按时间dzhpxtsq1#
Array.some()
方法来实现。如果在数组中找到所提供的函数返回TRUE的元素,则返回TRUE;否则返回FALSE。现场演示:
xghobddn2#
如果我们可以假设每个数组的元素(我们将它们称为子词典)以相同的顺序包含完全相同的键,那么我的想法是:
1.将每个数组转换为一个新数组,该数组的元素是原始子词典值的JSON表示。这是一个执行了两次的o(N)操作。
1.在转换后的新数组中,找到最短的数组。将另一个转换为集合。这也是o(N)。
1.对于较短的转换数组的每个元素,检查集合是否包含此值。这也是o(N)。
更新
如果子词典关键字不一定是有序的,那么我们必须从这些关键字有序的地方创建新的子词典:
修改代码
pkwftd7m3#
您可以通过在一行代码中组合filter和some找到仅具有相同ProductID的**对象来实现这一点。
为了更多的理解!这是同一作品的长篇形式:
hrysbysz4#
如果您希望进行深度相等比较(针对嵌套对象或所有
(key, value)
对),我建议使用base64
编码/解码来提高比较性能。因此,我的方法是:1.合并数组并将对象转换为Base64字符串。
1.将递归组合在一起
1.过滤重复项
1.将Base64字符串还原为其原始对象。
qltillow5#
我将发布两个解决方案:
第一个解决方案是可读性的代码不是100%的性能优化,但它是可读性和优雅的。
带有工作代码的操场链接
首先,我们需要一个比较任意类型的两个对象的方法。该方法比较第一级属性,因此如果我们有嵌套的对象属性,它将通过引用比较它们。
然后,我们可以实现适用于任何数组类型的可读性INTERSECT方法:
第二种解决方案以性能为导向,缺点是可读性不太好
首先,我们计算所有对象的Has,然后在单个forEach循环中,我们可以基于该Hash识别交集。我使用了MD5,但可以使用任何散列算法或库。
她的是stack blitz link playground。它可以运行,忽略导入错误。
fivyi3re6#
对于简单但相当快的解决方案,您可以(1)使用第一个阵列中的
Set
,然后(2)filter
基于第一个阵列中的ID的第二个阵列,这样您只需在每个阵列中检查一次O(n)
。egdjgwm87#
只需携带@Roh?t Jíndal,您可以检查数组是否有一个特定的对象,如下所示: