如何查找数组中的唯一元素与重复元素?JavaScript实现代码
如何查找数组中的唯一元素与重复元素(JavaScript实现)
核心思路
要区分数组中的唯一元素(仅出现一次)和重复元素(出现多次),核心是统计每个元素的出现次数:
- 重复元素:筛选出出现次数大于1的元素(注意去重,避免重复输出同一元素)
- 唯一元素:筛选出出现次数恰好为1的元素
实现代码
1. 获取去重后的重复元素
以下两种方法适用于大多数基础类型(数字、字符串、布尔值)的数组:
方法一:使用普通对象统计次数
function getDuplicates(arr) { const countMap = {}; const duplicates = []; // 统计每个元素出现次数 for (const item of arr) { countMap[item] = (countMap[item] || 0) + 1; } // 筛选出现次数>1的元素 for (const key in countMap) { if (countMap[key] > 1) { // 还原元素类型(对象键默认是字符串) duplicates.push(isNaN(Number(key)) ? key : Number(key)); } } return duplicates; } // 示例: console.log(getDuplicates([1, 2, 2, 3, 3, 3, 4])); // 输出 [2, 3]
方法二:使用Map统计(更友好处理非字符串键)
function getDuplicates(arr) { const countMap = new Map(); arr.forEach(item => { countMap.set(item, (countMap.get(item) || 0) + 1); }); // 筛选并返回重复元素 return [...countMap.keys()].filter(key => countMap.get(key) > 1); } // 示例: console.log(getDuplicates(['a', 'b', 'b', 'c', 'a'])); // 输出 ['a', 'b']
2. 获取唯一元素
方法一:对象统计法
function getUniqueElements(arr) { const countMap = {}; const uniqueElements = []; for (const item of arr) { countMap[item] = (countMap[item] || 0) + 1; } for (const key in countMap) { if (countMap[key] === 1) { uniqueElements.push(isNaN(Number(key)) ? key : Number(key)); } } return uniqueElements; } // 示例: console.log(getUniqueElements([1, 2, 2, 3, 4, 4])); // 输出 [1, 3]
方法二:数组filter结合indexOf/lastIndexOf(简单但性能较低)
这种方法无需额外统计,但时间复杂度为O(n²),适合小型数组:
function getUniqueElements(arr) { return arr.filter(item => arr.indexOf(item) === arr.lastIndexOf(item)); } // 示例: console.log(getUniqueElements(['x', 'y', 'x', 'z'])); // 输出 ['y', 'z']
注意事项
- 如果数组包含复杂类型(如对象、数组),上述方法无法直接使用,需要自定义比较逻辑(比如对比对象的特定属性,或者实现深度相等判断)。
- 大数据量场景下,优先选择Map/对象统计的方法(O(n)时间复杂度),避免使用filter结合indexOf的方法(O(n²)时间复杂度)。
内容的提问来源于stack exchange,提问作者dhee
相关产品推荐
相关产品推荐

