Array.prototype.intersect = function(b) {
  var flip = {};
  var res = [];
  for(var i=0; i< b.length; i++) flip[b[i]] = i;
  for(i=0; i<this.length; i++)
    if(flip[this[i]] != undefined) res.push(this[i]);
  return res;
}a = [1,2,3,4, 'a', 'c'];
b = [2,4,'c'];
document.write(a.intersect(b)); //2,4,c2 个数组求交集,如按 2 重循环对比则时间复杂度 o(n*n)
本算法思路为:
将其中一个数组转换为对象(值:键),可理解为哈希表 o(n)
遍历另一数组 o(n) 查表 o(0)
所以时间复杂度为 o(n+n)

解决方案 »

  1.   

    var a=["c",54,11,33,22,"dd",55,77,65,45],
    b=["dd",11,22,33,12,14,13,15,16],
    c=["c",11,22,"dd",21,23,24,25];function cros(arr1,arr2){
        var hash={}, result=[];
        for(var i=0;arr1[i]!=null;i++)hash[arr1[i]]=true;
    for(var i=0;arr2[i]!=null;i++){
    if(hash[arr2[i]]){
    result.push(arr2[i])
    }
    }
        return result
    }cros(cros(a,b),c)
      

  2.   

    a.intersect(b).intersect(c).intersect(d)
    不是很简单吗?
      

  3.   

    <script type="text/javascript">
        function fun(arrs){
           var arr = arrs.shift();
           for(var i=arrs.length;i--;){
               var p = {"boolean":{}, "number":{}, "string":{}}, obj = [];
               arr = arr.concat(arrs[i]).filter(function (x) {
                   var t = typeof x;
                   return !((t in p) ? !p[t][x] && (p[t][x] = 1) : obj.indexOf(x) < 0 && obj.push(x));
               });
               if(!arr.length) return null;//发现不符合马上退出
           }
           return arr;
        }
        var a = [
                [0,false,11,null,22,"dd",NaN,77,65,45],
                ["dd",false,null,NaN,12,14,13,15,16],
                ["null",NaN,22,"dd",21,false,24,0]
        ];
        console.log(fun(a));
    </script>
    两两数组比较,取出相同元素组成新数组。发现为空时马上退出。