我有两个用户ID数组,想要检查它们中的不同项。
arr1 = [123, 456, 789];
arr2 = [123, 456, 789, 098];
问题是:这些数组可能有1000万或2000万个项目。
我正在尝试使用
underscore.difference()
,但需要10分钟才能完成。有没有更快的方法?
我有两个用户ID数组,想要检查它们中的不同项。
arr1 = [123, 456, 789];
arr2 = [123, 456, 789, 098];
underscore.difference()
,但需要10分钟才能完成。使用本地js,而不是试图适应许多情况/输入的库。
简单优化:
var array1 = [];
var array2 = [];
var difference = [];
for(var i = 0; len = array1.length; i < len; i++)
{
var value = array1[i];
if(value == array2[i])
{
continue;
}
if(array2.indexOf(value) == -1)
{
difference.push(value);
}
}
var arr1 = [123, 456, 789], arr2 = [123, 456, 789, 098];
function toObject(arr){
return arr.reduce(function(o, v, i) {
o[v] = i;
return o;
}, {});
}
var o1 = toObject(arr1), o2 = toObject(arr2), diff = [];
for(var prop in o2){
if(o1[prop] === undefined)
diff.push(prop);
}
console.log(diff);
arr2
。 - Aaron DufourhasOwnProperty
更改为 if(!o1[prop])
。如果数据集包含0,请使用 if(o1[prop] === undefined)
,因为使用 undefined
可能更快,因为它不需要进行任何类型转换。 - Metalstorm这意味着数组中没有数字0或1:
var arr1 = [123, 456, 789,3],
arr2 = [123, 456, 789, 098],
has = {},
different=[],
length1=arr1.length,
length2=arr2.length;
for(var i=0;i<length1;i++){
has[arr1[i]]=true;
}
for(var i=0;i<length2;i++){
var val=arr2[i];
if(has[val] === undefined){
has[val]=val;
}
else{
if(has[val]!=val){
has[val]=false;
}
}
}
for(var i in has){
if (has[i]) different.push(i);
}
for(var i=0;i<length1;i++){
has[arr1[i]]=NaN;
}
for(var i=0;i<length2;i++){
var val=arr2[i];
if(has[val] === undefined){
has[val]=null;
}
else{
if(has[val]!=null){
has[val]=true;
}
}
}
for(var i in has){
if (!has[i]) different.push(i);
}
alert
!! - Metalstorm这里有一个快速的方法可以避免 _.difference 调用嵌套迭代:
var arr1 = [123, 456, 789],
arr2 = [123, 456, 789, 098],
has = {};
arr1.forEach(function(a){ this[a]=1;}, has);
alert( arr2.filter(function(a){return !this[a]; }, has) );
通过在迭代中使用this,我们将一个纯函数交给JS以在最大可能的速度下执行。
请注意,这对于对象数组或像[1,"1"]这样的混合类型数组是不起作用的,但它应该适用于问题的描述和问题演示。
编辑:如果您想要双向比较(例如arr1有,arr2缺少或反之亦然),请反转并重复上面的代码。与使用indexOf()方法的方法相比,您仍然只需要进行4000万次计算,而不是100万亿次...
arr1
中不在arr2
中的项目。 - cookie monsterthis
将成为全局变量,这使得它绝对不是一个纯函数,而且会污染全局命名空间。 - Aaron DufourforEach
的第二个参数。有趣。 - Aaron Dufour
_.difference
甚至没有使用集合..因此使用集合/探针将是*更好的边界。请参见https://dev59.com/NGcs5IYBdhLWcg3wGQDF - user2864740