如何过滤字符串数组,去除反向重复的成对条目?
问题描述
我有如下字符串数组:
[ '192.168.1.1 - 192.168.2.2', '192.168.2.2 - 192.168.1.1', '192.168.8.8 - 192.168.9.9', '192.168.9.9 - 192.168.8.8' ]
该数组本质结构为:
[ 'A - B', 'B - A', 'X - Y', 'Y - X' ]
希望从这类反向成对的条目中仅保留一个,得到如下结果数组:
[ '192.168.1.1 - 192.168.2.2', '192.168.8.8 - 192.168.9.9' ]
或者抽象后的结果:
[ 'A - B', 'X - Y' ]
请问该如何实现这一需求?
解决方案
核心思路
给每个条目生成唯一标识:拆分出两端的内容,按固定规则(比如字典序)排序后拼接成键。这样反向的两个条目会生成相同的键,利用这个键去重,只保留首次出现的原条目即可。
JavaScript 实现
const arr = [ '192.168.1.1 - 192.168.2.2', '192.168.2.2 - 192.168.1.1', '192.168.8.8 - 192.168.9.9', '192.168.9.9 - 192.168.8.8' ]; const seen = new Set(); const result = arr.filter(item => { // 拆分两端点并去除空格 const [a, b] = item.split(' - '); // 生成排序后的唯一键 const key = [a, b].sort().join('-'); if (!seen.has(key)) { seen.add(key); return true; } return false; }); console.log(result); // 输出:['192.168.1.1 - 192.168.2.2', '192.168.8.8 - 192.168.9.9']
Python 实现
arr = [ '192.168.1.1 - 192.168.2.2', '192.168.2.2 - 192.168.1.1', '192.168.8.8 - 192.168.9.9', '192.168.9.9 - 192.168.8.8' ] seen = set() result = [] for item in arr: # 拆分两端点 a, b = item.split(' - ') # 生成排序后的唯一键(元组可存入集合) key = tuple(sorted([a, b])) if key not in seen: seen.add(key) result.append(item) print(result) # 输出:['192.168.1.1 - 192.168.2.2', '192.168.8.8 - 192.168.9.9']
说明
- 拆分字符串时,要匹配原数组的分隔符
' - '(两端带空格),避免拆分错误。 - 默认采用字典序排序,对于IP地址这类字符串有效,也可根据需求自定义排序逻辑。
- 用集合记录已处理的键,保证去重操作的高效性。
内容的提问来源于stack exchange,提问作者Safwan Bardolia
相关产品推荐
相关产品推荐

