如何在JavaScript中找出两个数组的公共元素(保留重复次数匹配项)
在JavaScript中找出两个数组的公共元素(匹配重复次数)
假设我们有两个数组,需要提取它们的公共元素,且每个元素的出现次数要和两个数组中该元素出现次数的最小值一致。比如:
- 数组1:
['dog', 'cat', 'zebra', 'lion', 'cat'] - 数组2:
['dog', 'cat', 'cat', 'frog'] - 预期结果:
['dog', 'cat', 'cat']
方法一:使用Map统计元素次数
这种方法利用Map记录第一个数组中每个元素的出现次数,再遍历第二个数组筛选符合条件的元素:
function findCommonElements(arr1, arr2) { const countMap = new Map(); // 统计第一个数组中各元素的出现次数 for (const item of arr1) { countMap.set(item, (countMap.get(item) || 0) + 1); } const result = []; // 遍历第二个数组,提取符合条件的元素 for (const item of arr2) { const currentCount = countMap.get(item); if (currentCount > 0) { result.push(item); countMap.set(item, currentCount - 1); } } return result; } // 测试示例 const arrA = ['dog', 'cat', 'zebra', 'lion', 'cat']; const arrB = ['dog', 'cat', 'cat', 'frog']; console.log(findCommonElements(arrA, arrB)); // 输出: ['dog', 'cat', 'cat']
方法二:使用普通对象统计元素次数
如果数组元素都是字符串或可作为对象键的基本类型,也可以用普通对象统计次数,逻辑和Map版本一致:
function findCommonElements(arr1, arr2) { const countObj = {}; // 统计第一个数组的元素次数 for (const item of arr1) { countObj[item] = (countObj[item] || 0) + 1; } const result = []; // 筛选第二个数组中的匹配元素 for (const item of arr2) { if (countObj[item] > 0) { result.push(item); countObj[item]--; } } return result; }
注意事项
- 上述方法仅适用于元素为基本类型(字符串、数字、布尔值等)的场景,如果数组包含引用类型(如对象),需要额外处理元素的比较逻辑。
- 两种方法的时间复杂度都是O(n + m),其中n和m分别是两个数组的长度,效率较高。
内容的提问来源于stack exchange,提问作者Plshelp
相关产品推荐
相关产品推荐

