比较两个数组并找到第二个数组中缺失的项目。

7

我有两个数组,它们在开始时是相同的,但用户可能会从第二个数组中移除(无法添加,仅删除)项目。 我想找到在第一个数组中但不在第二个数组中的项目。

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

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

请分享这两个数组。 - brk
如果它能正常工作,我认为你的方法非常有效。 - Luis Gar
5个回答

20

您可以尝试使用以下方式使用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
我不明白为什么人们会对正确的答案进行负评。如果你一无所知,那就闭嘴学习吧。这就是正确的答案。 - connexo
由于作者明确提到了效率:假设数组已排序,我们可能想要进行二分查找。 - Jan Wendland

5
假设数组的顺序相同,则可以使用索引作为闭包进行筛选。

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);


1
这会增加额外的限制,而且比Christos的答案难以阅读。 - connexo
它是对i的闭包,并返回一个带有a => ...的函数体,该函数体按给定顺序过滤出array2的值。这需要进行检查,如果不相等,则通过递增索引并取逻辑非来返回truefalse。与includes/indexOf解决方案相比,它的优点在于尊重顺序,如果包含更多相同的值。 - Nina Scholz
我想知道(0)的意义,以及它是否允许您在i上构建闭包。我知道获取数组元素和索引的唯一方法是使用前两个过滤器参数:.filter((a,i) => …),而(0)完全让我困惑(最初没有意图双关语)。 - Brandon McConnell
1
@BrandonMcConnell,我需要i用于array2。如果iarray1的索引,则在没有额外偏移量的情况下进行过滤是行不通的。 - Nina Scholz
@Nina,那部分对我来说很有意义。真正困扰我的是这个0 - Brandon McConnell
显示剩余8条评论

2
在数组上执行.filter,并使用.includes检查数组2是否没有该元素。

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

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

console.log(absent);


谢谢。让我检查这些算法的性能时间。实际上,我知道一种方法来做它,但正在寻找更好的性能。 - Ashkan Mobayen Khiabani
@AshkanMobayenKhiabani 是的,但是这段代码足够小而快速,可以完成这个任务。如果只需要检查数组是否包含元素,那么.includes在性能方面比.indexOf更好。 - void

1
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;

}

使用此函数获取两个集合之间的差异。
A:集合1
B:集合2
A-B:在A中出现但不在B中的元素
基本集合理论

你的答案表现很出色,但由于我只能标记一个答案,我选择了Nina的,因为它更短。+1 - Ashkan Mobayen Khiabani

0
由于用户可以删除项目,因此您可以将这些已删除的项目添加到不同的数组中。
var deltedItems = [];
var position = 0;

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接