比较两个数组并查找第二个数组中缺少的项目[重复]
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】:您可以尝试使用filter
和indexOf
数组方法,如下所示:
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
。如果i
是array1
的索引,则在没有额外偏移的情况下无法过滤。【参考方案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
变量中找到所有已删除的项目。
通过使用此逻辑,您可以消除程序的搜索成本。
【讨论】:
以上是关于比较两个数组并查找第二个数组中缺少的项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章