Coffeescript 如何求n个数组的交集

Coffeescript 如何求n个数组的交集,coffeescript,Coffeescript,我有n个数组或可变长度 arr1 = [1,2,3] arr2 = [1,3,5,8] .... 如何计算这n个数组的交集?可以使用类似或的方法,如果愿意,可以重写它。考虑签出库。它提供了您需要的功能和一系列其他有用的功能 文档中的示例: _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); => [1, 2] 可以找到简单的纯JS实现。咖啡脚本中的相同想法: intersect_all = (lists) -> if lis

我有n个数组或可变长度

arr1 = [1,2,3]
arr2 = [1,3,5,8]
....

如何计算这n个数组的交集?

可以使用类似或的方法,如果愿意,可以重写它。

考虑签出库。它提供了您需要的功能和一系列其他有用的功能

文档中的示例:

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]
可以找到简单的纯JS实现。咖啡脚本中的相同想法:

intersect_all = (lists) ->
  if lists.length is 0
    return []
  else return lists[0]  if lists.length is 1
  partialInt = lists[0]
  i = 1

  while i < lists.length
    partialInt = intersection(partialInt, lists[i])
    i++
  partialInt
intersect\u all=(列表)->
如果lists.length为0
返回[]
如果lists.length为1,则返回lists[0]
partialInt=列表[0]
i=1
而我的长度
partialInt=交叉点(partialInt,列表[i])
我++
偏袒

最有效的方法是使用哈希集:

function hashset (elements) {
  var i, set = {};
  if (!Array.isArray(elements)) return elements;
  for (i = 0; i < elements.length; i++) {
    set[elements[i]] = true;
  }
  return set;
};

function intersect (a, b) {
  var k
    , s1 = hashset(a)
    , s2 = hashset(b)
    , s3 = {}
  for (k in s1) {
    if (s2[k]) s3[k] = true;
  }
  return s3;
};

Object.keys(intersect(arr1,arr2));
// ["1", "3"]
函数哈希集(元素){
var i,set={};
if(!Array.isArray(elements))返回元素;
对于(i=0;i
您将发现和一些附加信息


如果要与大型数组相交,我强烈建议您使用这种方法。

这里有一个很大的警告:这只适用于数组包含字符串或者您可以将元素作为字符串进行比较的情况。数组是否始终包含整数?@muistooshort:是的,仅包含整数