如何在 JavaScript 中使用兩個陣列的交集建立陣列?


在 JavaScript 中,可以透過多種方式實現兩個陣列的交集,例如使用 Set、擴充套件運算子、filter() 方法或 includes() 方法。每種方法都有其自身的優缺點,因此需要考慮哪種方法最適合給定的任務。如果想要建立一個僅包含兩個陣列中都存在的元素的新陣列,則兩個陣列的交集非常有用。

讓我們舉個例子 -

arr1 = [ 2, 5, 7, 9, 11, 13, 15, 17 ]
arr2 = [ 1, 3, 5, 7, 11, 13, 16, 17 ]

intersecArr = [ 5, 6, 11, 13, 17 ]

上面我們定義了兩個陣列 arr1 和 arr2,其中包含一些兩個陣列中都存在的相同值。兩個陣列的交集是 antersecArr。

讓我們討論一下在 JavaScript 中使用兩個陣列的交集建立陣列的這些方法。

方法 1:使用 filter() 和 includes() 方法

我們可以使用 filter() 和 includes() 方法對兩個陣列執行交集操作。filter() 方法接受一個函式作為其引數,並將其應用於陣列中的每個元素。該函式應返回一個布林值,true 或 false,指示是否應將該元素包含在新陣列中。在我們的例子中,我們想要兩個輸入陣列中都存在的元素,因此我們將使用 includes() 方法來檢查該元素是否在另一個數組中。

語法

以下是使用 filter() 和 include() 方法使用兩個陣列的交集建立新陣列的語法 -

let intersection = arr1.filter(x => arr2.includes(x));

filter() 方法接受一個回撥函式作為其引數。此回撥函式應用於第一個陣列 (arr1) 的每個元素,並使用 includes() 方法檢查當前元素 (x) 是否存在於第二個陣列 (arr2) 中。如果當前元素 (x) 存在於第二個陣列 (arr2) 中,則將其包含在新陣列 (intersection) 中。

如果當前元素 (x) 不存在於第二個陣列 (arr2) 中,則將其從新陣列 (intersection) 中排除。最終結果是一個新陣列 (intersection),其中僅包含 arr1 和 arr2 中都存在的元素。

示例

在下面的示例中,我們建立了兩個陣列,arr1 和 arr2,每個陣列都有五個元素,其中三個相同。然後使用 filter 和 include 方法建立一個新陣列,其中包含兩個陣列中的公共元素。

<html>
<head>
   <title>Creating an Array using Intersection of two Arrays using Filter() and Includes() methods</title>
</head>
<body>
   <p id="arr1"></p>
   <p id="arr2"></p>
   <p id="result"></p>
   <script>
      let arr1 = [5, 6, 8, 11, 15];
      let arr2 = [3, 5, 8, 11, 17];
            
      document.getElementById("arr1").innerHTML = "Array 1: " + JSON.stringify(arr1);
      document.getElementById("arr2").innerHTML = "Array 1: " + JSON.stringify(arr2);
            
      const intersection = arr1.filter(x => arr2.includes(x));

      document.getElementById("result").innerHTML = "Intersection of Array1 & Array 2: " + JSON.stringify(intersection);
   </script>
</body>
</html>

以上程式碼將建立一個新陣列 intersectionArray,其中僅包含兩個輸入陣列中都存在的元素。

方法 2

在這種方法中,我們首先從 arr1 的元素建立一個新的 set 物件。它刪除了任何重複的元素。然後使用擴充套件運算子將 set 物件轉換為陣列。此陣列沒有重複元素。現在我們使用 filter() 和 include() 方法執行交集操作。進一步的過程與第一種方法相同。

let intersection = [...new Set(arr1)].filter(x => arr2.includes(x));

以上語法建立了一個新陣列“intersection”。它包含 arr1 和 arr2 中存在的元素,在刪除 arr1 中的任何重複項之後。

示例

<html>
<head>
   <title>Creating an Array using Intersection of two Arrays using Spread Operator and Filter() method</title>
</head>
<body>
   <p id="arr1"></p>
   <p id="arr2"></p>
   <p id="result"></p>
   <script>
      let arr1 = [4, 8, 12, 16, 20, 28];
      let arr2 = [8, 16, 20, 24, 28, 30];

      document.getElementById("arr1").innerHTML = "Array 1: " + JSON.stringify(arr1);
      document.getElementById("arr2").innerHTML = "Array 1: " + JSON.stringify(arr2);
        
      let intersection = [...new Set(arr1)].filter(x => arr2.includes(x));

      document.getElementById("result").innerHTML = "Intersection of Array1 & Array 2: " + JSON.stringify(intersection);

   </script>
</body>
</html>

方法 3:使用 Set

在這種方法中,首先,我們使用 new Set() 建構函式將陣列轉換為集合。然後使用 for...of 迴圈遍歷第二個集合的元素。然後使用 has() 方法檢查該元素是否在第一個集合中。如果該元素存在於第一個集合中,則使用 push() 方法將該元素新增到交集陣列中。

示例

<html>
<head>
   <title>Creating an Array using Intersection of two Arrays using Set</title>
</head>
<body>
   <p id="arr1"></p>
   <p id="arr2"></p>
   <p id="result"></p>
   <script>
      function doIntersection(arr1, arr2) {
         const setFirst = new Set(arr1);
         const setSecond = new Set(arr2);
         let intersection = [];
         for (let i of setSecond) {
            if (setFirst.has(i)) {
               intersection.push(i);
            }
         }
         return intersection;
      }

      const arrFirst = [4, 6, 8, 10, 12];
      const arrSecond = [4, 5, 8, 12, 15];

      document.getElementById("arr1").innerHTML = "Array 1: " + JSON.stringify(arrFirst);
      document.getElementById("arr2").innerHTML = "Array 1: " + JSON.stringify(arrSecond);

      const interResult = doIntersection(arrFirst, arrSecond);

      document.getElementById("result").innerHTML = "Intersection of Array1 & Array 2: " + JSON.stringify(interResult);
   </script>
</body>
</html>

在本教程中,我們討論了三種使用示例建立使用兩個陣列的交集的陣列的方法。在第一種方法中,我們使用 filter() 和 include() 方法,而在第二種方法中,我們除了使用 filter 和 include 之外,還使用了擴充套件運算子和 Set。在第三種方法中,我們建立了一個自定義函式來執行此任務。

更新於: 2023年2月23日

2K+ 閱讀量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告