JavaScript如何过滤数组仅保留无重复及无对应相反数的元素
JavaScript 数组按规则过滤实现方案
核心规则拆解
过滤需求可拆为两个排除条件,满足任意一条的元素就需要剔除:
- 相同值在数组中出现次数≥2
- 数组中同时存在该值和它的相反数
只有两个条件都不满足的元素,才会保留到最终结果中。
实现代码
const arrOne = [1, 1, 2, 3, 4, 6, 6, 7, -7, 8, -8]; // 第一步:统计每个值的出现频率 const freqMap = arrOne.reduce((map, num) => { map.set(num, (map.get(num) || 0) + 1); return map; }, new Map()); // 第二步:去重后按条件过滤,避免重复判断相同值 const uniqueArr = [...new Set(arrOne)]; const result = uniqueArr.filter(num => { // 仅保留:当前值出现次数为1,且不存在相反数 return freqMap.get(num) === 1 && !freqMap.has(-num); }); console.log(result); // 输出 [2, 3, 4]
逻辑说明
- 先用
reduce遍历原数组生成频率Map,O(n)时间复杂度完成所有值的出现次数统计 - 用Set对原数组去重,减少后续过滤的遍历次数
- 过滤时同时判断两个保留条件,最终得到符合要求的结果
- 方案默认兼容0的场景:0的相反数是自身,只要出现次数≥2就会自动剔除,无需额外修改逻辑。
内容的提问来源于stack exchange,提问作者heyheyhey
相关产品推荐
相关产品推荐

