我有两个数组,它们在开始时是相同的,但用户可能会从第二个数组中移除(无法添加,仅删除)项目。 我想找到在第一个数组中但不在第二个数组中的项目。
我可以想到几种方法来做到这一点,但由于这些数组可能非常大,因此我很想知道是否有人能提供更有效的方法:
$.grep( firstArray, function( n, i ){
return $.inArray(n, secondArray) == -1;
});
我有两个数组,它们在开始时是相同的,但用户可能会从第二个数组中移除(无法添加,仅删除)项目。 我想找到在第一个数组中但不在第二个数组中的项目。
我可以想到几种方法来做到这一点,但由于这些数组可能非常大,因此我很想知道是否有人能提供更有效的方法:
$.grep( firstArray, function( n, i ){
return $.inArray(n, secondArray) == -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);
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);
i
的闭包,并返回一个带有a => ...
的函数体,该函数体按给定顺序过滤出array2
的值。这需要进行检查,如果不相等,则通过递增索引并取逻辑非来返回true
或false
。与includes/indexOf
解决方案相比,它的优点在于尊重顺序,如果包含更多相同的值。 - Nina Scholz(0)
的意义,以及它是否允许您在i
上构建闭包。我知道获取数组元素和索引的唯一方法是使用前两个过滤器参数:.filter((a,i) => …)
,而(0)
完全让我困惑(最初没有意图双关语)。 - Brandon McConnelli
用于array2
。如果i
是array1
的索引,则在没有额外偏移量的情况下进行过滤是行不通的。 - Nina Scholz0
。 - Brandon McConnell.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);
.includes
在性能方面比.indexOf
更好。 - voidfunction 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;
}
使用此函数获取两个集合之间的差异。var deltedItems = [];
var position = 0;
function onDeleteItem(value){
deltedItems[position] = value;
position++;
}
在这里,您可以在 deltedItems
变量中找到所有已删除的项目。
通过使用此逻辑,您可以消除程序的搜索成本。