Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中查找两个数组的交集_Javascript_Algorithm_Optimization_Data Structures - Fatal编程技术网

在Javascript中查找两个数组的交集

在Javascript中查找两个数组的交集,javascript,algorithm,optimization,data-structures,Javascript,Algorithm,Optimization,Data Structures,这是一个亚马逊采访的问题,我有一个问题,我的答案是 function intersection ( A , B ) { var C = []; for ( var a in A ) if ( B.indexOf(a) != -1 ) C.push(a); return C; } 他问复杂性的顺序是什么,我说,我准确地引用 O(m*n),其中m=A.长度,n=B.长度 他说有更好的方法,我就像WTF一样???????他说用A和B作为对象,我就像 “但你说这些是数组,这是

这是一个亚马逊采访的问题,我有一个问题,我的答案是

function intersection ( A , B ) 
{
    var C = [];
    for ( var a in A ) if ( B.indexOf(a) != -1 ) C.push(a);
    return C;
}
他问复杂性的顺序是什么,我说,我准确地引用

O(m*n),其中m=A.长度,n=B.长度

他说有更好的方法,我就像WTF一样???????他说用
A
B
作为对象,我就像

“但你说这些是数组,这是你的问题!!!!”


有人能帮我吗?

如果您知道数组值是字符串或数字,您可以创建一个对象,该对象的值为属性名和每个属性的真实值。然后可以在通过第二个数组的过程中使用简单的对象查找

比如:

function intersection ( A , B ) 
{
    var m = A.reduce(function(m, v) { m[v] = 1; return m; }, {});
    return B.filter(function(v) { return m[v]; });
}
编辑-要从结果中删除重复项,可以使用另一个
.reduce()
过程:

function intersection ( A , B ) 
{
    var m = A.reduce(function(m, v) { m[v] = 1; return m; }, {});
    return B.reduce(function(rv, v) {
      if (!rv.m[v]) {
        rv.m[v] = 1;
        rv.l.push(v);
      }
      return rv;
    }, {m:{}, l:[]}).l;
}

我不知道“作为对象使用”有什么帮助,但是如果你在开始之前从
B
中创建一个查找表(字典),那么你可以在O(n)中完成。如果你在另一个JavaScript访谈中,不要使用
来。。。在
中循环遍历数组。顺便说一句,这个问题有很多问题,例如:@JonTrauntvein不,它将是O(n+m),这实际上只是O(n)。如果
A和
B
是数组,这不会做它假装的事情。在
for(var a In a){…}
中,变量
a
将保存索引。如果值是对象,但引用相等是正确的,则可以使用Set()@Touffy yes很好,事实上,无论如何都可以使用Set。我还没有完全适应ES2015:)请注意,在实践中,如果A.length或B.length很小,那么使用数组查找实际上可能会获得更好的性能:(from)@nrabinowitz是的,现代浏览器以某种方式执行
.indexOf()
的速度非常快。或者它们的对象键查找开销比预期的要大。