比较两个数组并查找第二个数组中缺少的项目[重复]

Posted

技术标签:

【中文标题】比较两个数组并查找第二个数组中缺少的项目[重复]【英文标题】:Compare two arrays and find items that are missing in second array [duplicate] 【发布时间】:2018-08-12 03:38:59 【问题描述】:

我有 2 个数组,它们起初是相同的,但用户可以从第二个数组中删除(不能添加但只是删除)项目。我想查找在第一个数组中但不在第二个数组中的项目。

我可以想到几种方法来做到这一点,但由于这些数组可能非常大,我很想知道是否有人可以提供更有效的方法:

$.grep( firstArray, function( n, i )
  return $.inArray(n, secondArray) == -1;
);

【问题讨论】:

请分享这两个数组 如果它有效,我认为你的方式非常有效 【参考方案1】:

您可以尝试使用filterindexOf 数组方法,如下所示:

var firstArray = [1,2,3,4,5,6];
var secondArray = [3,4,6];

var result = firstArray.filter(item => secondArray.indexOf(item) == -1);

console.log(result);

【讨论】:

我不明白为什么人们对正确答案投反对票。如果您不知道,请闭嘴学习。这是正确的答案。 正如作者明确提到的效率:假设已排序的数组可能想要进行二进制搜索【参考方案2】:

假设数组具有相同的顺序,那么您可以使用索引作为闭包进行过滤。

var array1 = [1, 2, 3, 4, 5, 6, 7, 1, 2, 3],
    array2 = [2, 4, 6, 7, 2],
    missing = array1.filter((i => a => a !== array2[i] || !++i)(0));
    
console.log(missing);

【讨论】:

这施加了额外的限制,而且远不如克里斯托斯的答案可读。 @connexo,提到的答案依赖于唯一值,可能没有给出。 @NinaScholz 很好的答案,Performance Comparison @NinaScholz,你能解释一下这部分吗,a => a !== array2[i] || !++i)(0),谢谢 @BrandonMcConnell,我需要i 换取array2。如果iarray1 的索引,则在没有额外偏移的情况下无法过滤。【参考方案3】:
function arr_diff (a1, a2) 
var a = [], diff = [];
for (var i = 0; i < a1.length; i++) 
    a[a1[i]] = true;

for (var i = 0; i < a2.length; i++) 
    if (a[a2[i]]) 
        delete a[a2[i]];
     else 
        a[a2[i]] = true;
    

for (var k in a) 
    diff.push(k);

return diff;

使用此函数来获取两组之间的差异。 答:设置 1 B:第 2 套 A-B:A 中存在但 B 中不存在的元素 基本集合论

【讨论】:

您的答案表现出色,但由于我只能标记一个答案,因此我选择了 Nina's 作为其较短的答案。 +1【参考方案4】:

在数组上做一个.filter,并检查数组2是否没有使用.includes的元素

var a1 = [1,2,3,4,5,6];
var a2 = [1,3,5];

var absent = a1.filter(e=>!a2.includes(e));

console.log(absent);

【讨论】:

谢谢。让我检查一下这些算法的性能时间。因为实际上,我知道一种方法可以做到这一点,但要寻求更好的性能。 @AshkanMobayenKhiabani 是的,但根据这是一个足够小且足够快的代码来完成这项任务。 .includes.indexOf 性能要好,如果您只需要检查数组是否包含元素。【参考方案5】:

因为用户可以删除项目。因此,您可以将那些已删除的项目添加到不同的数组中。

var deltedItems = [];
var position = 0;

function onDeleteItem(value)
   deltedItems[position] = value;
   position++;

在这里,您可以在 deltedItems 变量中找到所有已删除的项目。 通过使用此逻辑,您可以消除程序的搜索成本。

【讨论】:

以上是关于比较两个数组并查找第二个数组中缺少的项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果找到第一个数组中的特定键,则在第二个数组中查找值

如何将字符串数组拆分为新的字符串数组并删除重复项

从数组中删除所有某些重复项[重复]

比较数组中的元素,看看字符串中是不是有重复项

在两个数组中为javascript查找缺少的元素[重复]

面试题