JavaScript数组去重过滤IP地址需先标准化(trim+toLowerCase),再用Set去重;若含非法IP需正则或net.isIP()预校验;IPv6语义去重须用ipaddr.js等库解析归一化。

JavaScript 数组去重过滤重复 IP 地址,核心是把 IP 当作普通字符串处理,但要注意格式一致性(比如是否带空格、大小写、IPv4/IPv6 写法是否规范)。只要确保所有 IP 字符串标准化,就能用常规去重方法安全过滤。
先统一格式再用 Set 去重(推荐)
IP 地址本身不区分大小写,且首尾空格常见(尤其从表单或日志中提取时)。直接用 new Set(arr) 可能因空格或大小写导致“看似相同实则不同”的重复项残留。
- 用
map(s => s.trim().toLowerCase())清理空格并归一化(对 IPv6 地址也适用,尽管通常小写) - 再传给
Set,最后转回数组 - 示例:
const ips = ["192.168.1.1", " 10.0.0.5 ", "192.168.1.1", "10.0.0.5", "::1"]; const uniqueIPs = [...new Set(ips.map(ip => ip.trim().toLowerCase()))]; // → ["192.168.1.1", "10.0.0.5", "::1"]
需要校验 IP 合法性?加一步正则或库验证
如果原始数组可能混入非法字符串(如 "abc"、"192.168.500.1"),仅去重不够,应先过滤出合法 IP。
- 简单 IPv4 验证可用正则:
^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$ - 更可靠的做法是用
net.isIP()(Node.js 环境)或轻量库如is-ip - 组合使用:过滤 + 标准化 + 去重
保留首次出现顺序 & 兼容老浏览器?用 reduce 或 for 循环
Set 在现代环境表现好且保持插入顺序,但若需支持 IE11 或明确控制逻辑,可用 reduce:
立即学习“Java免费学习笔记(深入)”;
const uniqueIPs = ips .map(ip => ip.trim().toLowerCase()) .reduce((acc, ip) => acc.includes(ip) ? acc : [...acc, ip], []);
或更高效地用对象/Map 记录已见 IP:
const seen = new Set();
const uniqueIPs = [];
for (const ip of ips) {
const normalized = ip.trim().toLowerCase();
if (!seen.has(normalized)) {
seen.add(normalized);
uniqueIPs.push(normalized);
}
}
注意 IPv6 的特殊表示(如缩写、大小写)
IPv6 地址如 ::1 和 0:0:0:0:0:0:0:1 逻辑等价,但字符串不同。标准去重不会自动归一化。
- 如需真正语义去重,须用专门解析库(如
ipaddr.js)转为规范格式再比较 - 例如:
ipaddr.parse("::1").toString()→"::1",ipaddr.parse("0:0:0:0:0:0:0:1").toString()→"::1" - 日常场景中,若数据源只用一种格式(如全用
::1),可跳过此步


















