function array_intersect() { var sorted, shortest, ret = [], add, found, obj={}, nOthers; sorted = Array.prototype.slice.call(arguments).sort(function(i,j){return i.length>j.length;}); nOthers = sorted.length-1; shortest = sorted[0]; for (var i=nOthers; i>0; --i) { for (var j=sorted[i].length-1; j>=0; --j) { obj[sorted[i][j]] = (obj[sorted[i][j]]||0)+1; } } for (var k=shortest.length-1; k>=0; k--) { if (obj[shortest[k]]===nOthers) {ret.push(shortest[k]);} } return ret; }