当Array.includes返回true时,如何获取匹配元素的lastIndexOf?
问题描述
我有两个数组:
let arr1 = ['Red', 'Blue', 'Black', 'Gold', 'Silver', 'Black'] let arr2 = ['Black', 'White', 'Green']
我写了下面这个函数来检查arr1是否包含arr2里的值:
function findCommonElements(arr1, arr2) { return arr1.some(item => arr2.includes(item)) }
这个函数能正常运行,因为arr1包含Black所以返回true,但我想知道当findCommonElements返回true时,匹配元素在arr1中的lastIndexOf位置。
解决方案
方法1:先筛选共同元素再取最后位置
先把arr1里所有在arr2中的元素筛选出来,然后取最后一个元素在arr1里的最后出现位置:
function findLastCommonIndex(arr1, arr2) { const commonElements = arr1.filter(item => arr2.includes(item)); if (commonElements.length === 0) { return -1; // 没找到共同元素返回-1 } return arr1.lastIndexOf(commonElements.at(-1)); } // 测试结果 console.log(findLastCommonIndex(arr1, arr2)); // 输出 5
方法2:从后往前遍历(效率更高)
既然要找最后出现的位置,直接从arr1末尾开始找,第一个匹配arr2的元素索引就是结果,不用遍历整个数组。另外把arr2转成Set能提升查找速度:
function findLastCommonIndex(arr1, arr2) { const arr2Set = new Set(arr2); for (let i = arr1.length - 1; i >= 0; i--) { if (arr2Set.has(arr1[i])) { return i; } } return -1; // 无共同元素返回-1 } // 测试结果 console.log(findLastCommonIndex(arr1, arr2)); // 输出 5
补充说明
- 用
Set存储arr2元素是因为Set.has()的查找速度比数组includes()更快,元素越多差异越明显。 - 两种方法在没有共同元素时都返回
-1,和原生lastIndexOf的返回逻辑一致。
内容的提问来源于stack exchange,提问作者Azeem Ansari
相关产品推荐
相关产品推荐

