Javascript获取三个数组的公共元素

x7yiwoj4  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(132)

我试图过滤3个数组的公共元素。但是它没有得到3个数组的公共元素,而是只读取2个数组,而不是第3个数组。下面是我的代码,谢谢:

function commonElementsOfArray(arr1, arr2, arr3) {
    return arr1.filter(function (n) {
        return arr2.indexOf(n) !== -1;
        return arr3.indexOf(n) !== -1;
    });
}
svmlkihl

svmlkihl1#

正如@Titus提到的,代码中的问题是两个return语句-一旦找到第一个return,过滤函数将退出。
但是,在寻找Array.indexOf的公共元素的方法中,还有一个问题值得指出,问题是Array.indexOf是一个O(n)操作,这意味着将针对arr 2和arr 3的每个元素检查参数。但是如果数组很大,那么这将是一个非常慢的函数。例如,如果每个数组有1,000个条目(n)然后你的函数会取每个元素并与arr 2和arr 3中的所有元素进行比较导致每个元件数千次操作(× 1 m,× 1 n时间复杂度)。
另一种方法是创建一个Map,并在遍历每个数组时填充它,以跟踪条目被看到的次数。查找值现在具有O(1)运行时。仍然存在遍历每个数组生成O(n)的成本,但由于快速查找,这变成了n * 1操作或O(n)时间复杂度。

function commonElementsOfArray(...arrays) {
  const size = arrays.length;
  const map = new Map();
  
  arrays.forEach(arr => {
    arr.forEach(entry => {
      if (!map.has(entry)) {
        map.set(entry, 1);
      } else {
        let timesSeen = map.get(entry);
        map.set(entry, ++timesSeen);
      }
    });
  });

  const commonElements = [];
  map.forEach((count, key) => {
    if (count === size) {
      commonElements.push(key);
    }
  });

  return commonElements;
}

console.log(commonElementsOfArray([1, 2, 3], [1, 2, 4], [2, 4, 5]));
nhn9ugyo

nhn9ugyo2#

将OP的代码重构为泛型交集函数如何?该函数实现两个数组的简化交集函数,并通过处理泛型函数(数组类型)参数的reduce任务生成两个以上数组的总交集。
因此,两个数组的交集将基于OP的代码filter方法,但使用includes而不是indexOf

function getIntersectionOfTwo(a, b) {
  return a.filter(function (n) {
    return b.includes(n);
  });
}

泛型getIntersection只需要确保其参数的类型安全性、参数太少时的正确返回值以及正确提供的参数数量最少时的交集结果...
x一个一个一个一个x一个一个二个x
为了更好地理解整个任务的重构过程,上面示例中getIntersectionOfTwo of cause的实现保持简单。
在下一个重构步骤中,这个函数也可以被改进,以便更有效地处理大量数组数据,因此可以在filter回调中使用基于Map的查找,而不是在每个filter迭代中搜索是否是b.includes(n)
一个三个三个一个

相关问题