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)
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)
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)
不是很简单吗?
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>
两两数组比较,取出相同元素组成新数组。发现为空时马上退出。