比较 javascript 中的共同值的未指定数量的数组

Compare an unspecified number of arrays for common values in javascript

我想知道如何比较两个或更多(可能无限)数组的共同值,并将这些值有效地推入新数组。下面我有一个接受无限参数的函数,但我不确定这是否是一个好的起点。 PHP 似乎有一个方法可以做我想做的事情,叫做 array_intersect。 javascript 是否提供类似的东西?

注意:我已经找到了如何使用两个左右数组完成此操作的示例,但我还没有找到如何将此类方法应用于未指定数量的数组的示例。因此我不认为这是一个重复的问题。

为了进一步说明,数组可能填充了任何东西。字母、数字、符号、单词,凡是你能想到的,它都可能在那里。

var sampleOne = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var sampleTwo = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];

function FindDirectRelation() {
    for(var i = 0; i < arguments.length; ++i) {
        console.log(arguments[i]);
        

    };
};

var directRelation = FindDirectRelation(sampleOne, sampleTwo);

我还是一个编码新手,所以请确保所有内容都以我能够理解的方式进行解释。

使用现有的与 2 个数组一起使用的相交,我们可以使用内置的 reduce() 方法将一个公共子集链接在一起,该方法需要相交的数组:

function intersect(a, b) {
  var aa = {};
  a.forEach(function(v) { aa[v]=1; });
  return b.filter(function(v) { return v in aa; });
}

var r1=[1,2,3], 
r2=[1,3,4,5], 
r3=[5,1,3];

alert([r1, r2, r3].reduce(intersect)) // shows: 1,3

如果您将 "intersect" 定义为仅在多个数组(不是每个数组)中,那么它会更复杂...

尝试使用 Array.prototype.filter() , Array.prototype.indexOf()

var res = sampleOne.filter(function(val) {return sampleTwo.indexOf(val) !== -1})

var sampleOne = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var sampleTwo = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
var arr = ["a", "b", "c"];
var arr1 = ["c", "d", "e"];
var arr2 = [2, 7];

function samples() {
  var args = Array.prototype.slice.call(arguments);
  var res = [];
  for (var i = 0, curr, next; i < args.length; i++) {
    if (args[i + 1]) {
      // set `curr` to array `i`
      curr = args[i];
      // set `next` to array `i + 1` if it exists
      next = args[i + 1]
    } else {
      // if at last index, set `curr` to `args` : input arrays 
      // flattened to single array , with element at `i` removed
      curr = [].concat.apply([], args.slice(0, args.length - 1));
      console.log(curr)
      // set next to current index
      next = args[i];
    };
    next = next.filter(function(val) {
      return curr.indexOf(val) !== -1 
             // filter duplicate entries at `res`
             && res.indexOf(val) === -1
    });
    res = res.concat.apply(res, next);
  };
  return res
}
var sample = samples(sampleOne, sampleTwo, arr, arr1, arr2);
console.log(sample); // [5, 6, 7, 8, 9, 10, 11, 12, "c", 2]

检查以确保第一个数组中的元素也在其余数组中:

function multi_intersect(a) {
  var other_arrays = Array.prototype.slice.call(arguments, 1);

  return a . filter(function(elt) {
    return other_arrays.every(function(an) {
      return an.indexOf(elt) !== -1;
    });
  });
}