如何在 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。在第三种方法中,我们创建了一个自定义函数来执行此任务。