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

时间:2015-09-25 16:26:11

标签: 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.length,n = B.length

他说这是一个更好的方法,我就像WTF ???????他说使用AB作为对象,我就像

  

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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:6)

如果您知道数组值是字符串或数字,则可以创建一个对象,该对象将值作为属性名称和每个值的truthy值。然后,您可以在传递第二个数组时使用简单的对象查找。

类似的东西:

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