Javascript 比较多个数组的数组元素

Javascript 比较多个数组的数组元素,javascript,arrays,Javascript,Arrays,我试图循环遍历一组数组,并将这些元素相互比较,以找到公共元素。假设我们有var-arr=[[1,2,3],[4,2,5]我想首先比较[I][I]和[I+1][I]、[I][I+1]和[I+1][I+1]以及[I][I+2]和[I+1][I+2]等等。这是我的密码: function sym(args) { var fullArr = []; var finalArr = []; // store the arguments inside a single array for (v

我试图循环遍历一组数组,并将这些元素相互比较,以找到公共元素。假设我们有
var-arr=[[1,2,3],[4,2,5]我想首先比较[I][I]和[I+1][I]、[I][I+1]和[I+1][I+1]以及[I][I+2]和[I+1][I+2]等等。这是我的密码:

function sym(args) {
  var fullArr = [];
  var finalArr = [];
  // store the arguments inside a single array
  for (var count = 0; count < arguments.length; count ++) {
    fullArr[count] = arguments[count];
  }
  // loop through finalArr[];
  for (var i = 0; i < fullArr.length; i++) {
    if (fullArr[i][i] == fullArr[i++][i++]) {
      // if the element matches (it is a common element)
      // store it inside finalArr
      finalArr[i] = fullArr[i];
    }
  }
  return finalArr;
}

sym([1, 2, 3], [5, 2, 1, 4]);
功能符号(args){
var fullArr=[];
var finalArr=[];
//将参数存储在单个数组中
对于(var count=0;count

问题:当我运行代码而不是包含匹配元素的数组时,会得到一个空数组

,您首先必须遍历一个数组,看看另一个数组是否包含您指定的值

我的答案类似于嵌套for循环,因为includes方法正是这样做的。它接受一个元素作为参数,并检查调用它的数组是否包含该元素。为了做到这一点,它必须在最坏的情况下遍历数组中的所有元素

我的回答还假设您只想计算一次重复的匹配

功能符号(args){
var fullArr=[];
var finalArr=[];
//将参数存储在单个数组中
对于(var count=0;countsym([1,2,3],[5,2,1,4])在代码中,当执行以下行时,您还可以增加控制变量
i
的值:

if(fullArr[i][i]==fullArr[i++][i++])

因此,
i
变量在每次迭代中递增的方式如下:

迭代#1:
i=0

迭代#2:
i=3
-从上面提到的行中得到i+2,从for循环的最终条件中指定的增量中再得到+1

因此,即使在第一次迭代之后,您的函数也会在特定场景中返回一个空数组,因为您正在传递一个长度为3的数组,而for循环在第一次迭代中在
i=0
之后结束

即使循环继续,它也会返回一个索引越界异常,因为长度为3的数组没有
数组[3]
元素

例如,如果您只想比较两个数组,就像在您的场景中一样,您需要遍历它们中的每一个并比较它们的元素:

function sym(array1, array2) {
  var results = [];


  for (var i = 0; i < array1.length; i++) {
      for (var j = 0; j < array2.length; j++) {
          if(array1[i] === array2[j]) {
              if(results.indexOf(array1[i]) === -1) {
                  results.push(array1[i]);
              }
          }
      }
  }

  return results;
}

sym([1, 2, 3], [5, 2, 1, 4]);

对于我提供的示例,上面的代码将返回
[1]
,因为这是所有3个数组的交集。

您可以迭代第一个数组,并检查它的任何值是否与所有其他数组相同

function sym() {
    var common = [];
    for (var i=0; i<arguments[0].length; i++) {
        var isCommon = common.indexOf(arguments[0][i]) === -1; // first check if its not already exists in the common array
        for (var j=1; j<arguments.length && isCommon; j++) {
            isCommon = arguments[j].indexOf(arguments[0][i]) > -1
        }
        if (isCommon) common.push(arguments[0][i])
    }
    return common;
}
函数sym(){
var公共=[];

因为(var i=0;i
fullArr[i++][i++]
并没有做你认为应该做的事情。它每次都在增加i,这是一种非常糟糕的做法(即使它起作用),因为阅读它的人记不起哪个i先增加,所以他们不确定它是指
fullArr[1][2]
还是
fullArr 2][1]
如果列表1是1,1,2,3,而列表2是1,1,1,2,3,该怎么办?1应该在最终输出数组中出现多少次?因此,您还没有指定如果有n个数组,该怎么办……我们是否只提取这三个数组中通用的值?这将导致重复匹配(假设我们不需要任何匹配)如果在第二个列表中,一个元素出现了多次,并且只与第一个列表中的一个元素匹配。确实-感谢您指出这一点。我现在已经修复了我的代码,以解释可能的重复。关闭…但是现在的问题是,如果1在任何数组中出现了多次,它将从结果集中消失。此外,如果1例如,在第二个数组中出现了两次,在第三个数组中出现了0次,那么您的实现仍然会在结果集中出现。您是正确的,感谢您的反馈。我修复了我的代码,以避免误导任何可能阅读我的答案的人-我测试了它并按它应该的方式工作。感谢您在我运行您的第一个cod时给出的答案我得到这个错误:TypeError:fullArr[1].includes不是一个函数请尝试使用IndexOfal使用我的第二个解决方案,因此我仍然不知道您是否希望在n个数组之间求交…您设置函数的方式似乎是这样的。好的,谢谢您的更新,很抱歉打扰了您的午餐时间。我正在尝试通过数组查找匹配的元素。您还可以做一件事吗解释这一行fullArr[0]。forEach(函数(e){是的,这个问题提出了多个数组,因此您的假设是正确的。无论如何,感谢lot@naortor你能解释一下这一行发生了什么吗:for(var j=1;j@zamzam-在该循环中,我将遍历所有其他数组,并检查参数[0][i]值在所有数组中-如果我发现一个数组中没有参数[0][I]值-保持循环没有任何意义。lt;dr在isCommon为true时循环所有其他数组。
function sym() {
    var common = [];
    for (var i=0; i<arguments[0].length; i++) {
        var isCommon = common.indexOf(arguments[0][i]) === -1; // first check if its not already exists in the common array
        for (var j=1; j<arguments.length && isCommon; j++) {
            isCommon = arguments[j].indexOf(arguments[0][i]) > -1
        }
        if (isCommon) common.push(arguments[0][i])
    }
    return common;
}