如何从含分隔符的多国邮政编码中推断数值范围,无需移除重加分隔符?
多国邮政编码区间提取优化问题
现有存储多国邮政编码的数组,格式示例如下:["100-1001","102-1000","102-1001","102-1002","100-1002","111","112","102-1003","113"]
需要将这些邮编推断为连续区间,输出格式为[[upper1,lower1],[upper2,lower2]],上述示例对应的输出应为:[["100-1001","100-1002"],["102-1000","102-1003"],["111","113"]]
现有实现逻辑
目前的方案是先移除所有分隔符转为纯数字,推断区间后再重新添加分隔符,已实现的无连字符邮政编码范围提取代码如下:
getRanges(zipCodes) { zipCodes.sort(); let length = 1; let ranges = []; for (let i = 1; i <= zipCodes.length; i++) { if (i == zipCodes.length || zipCodes[i] - zipCodes[i - 1] != 1) { if (length == 1) { let upper = lower = zipCodes[i - length]; ranges.push({lower, upper}); } else { let lower = zipCodes[i - length]; let upper = zipCodes[i - 1]; ranges.push({lower, upper}); } length = 1; } else { length++; } } return ranges; }
现在想要避免移除再重加分隔符的额外开销,求更优的区间解析方法。
优化方案
完全可以避免拆分重拼分隔符的开销,核心思路是写一个专用的相邻邮编连续性判断函数,直接对原始带格式的字符串做判断,不需要转换为纯数字,调整后的逻辑如下:
- 先对原始邮编数组做字典序排序(绝大多数国家的带分隔符邮编字典序和数值序完全一致,匹配你示例的场景)
- 遍历过程中直接调用连续性判断函数,判断当前邮编和上一个邮编是否连续
- 直接用原始字符串拼接最终的区间结果,不需要做任何格式转换
实现代码
// 辅助函数:判断两个邮编是否连续 function isZipConsecutive(prev, curr) { // 先判断两个邮编的格式(长度、是否带连字符)是否一致,格式不同直接不连续 if (prev.length !== curr.length || prev.includes('-') !== curr.includes('-')) { return false } // 无连字符的场景直接转数字判断差值 if (!prev.includes('-')) { return Number(curr) - Number(prev) === 1 } // 有连字符的场景先拆分前后段,判断前缀是否相同 const [prevPrefix, prevSuffix] = prev.split('-') const [currPrefix, currSuffix] = curr.split('-') if (prevPrefix !== currPrefix) { return false } // 前缀相同的情况下判断后缀差值是否为1 return Number(currSuffix) - Number(prevSuffix) === 1 } // 优化后的区间提取函数 function getZipRanges(zipCodes) { // 拷贝数组后按原始字符串字典序排序,避免修改原数组 const sorted = [...zipCodes].sort() const ranges = [] let currentStart = sorted[0] for (let i = 1; i < sorted.length; i++) { if (!isZipConsecutive(sorted[i-1], sorted[i])) { // 不连续就闭合上一个区间 ranges.push([currentStart, sorted[i-1]]) currentStart = sorted[i] } } // 闭合最后一个区间 ranges.push([currentStart, sorted[sorted.length - 1]]) return ranges }
方案优势
- 全程不需要修改原始邮编的格式,避免了拆分、拼接分隔符的额外开销
- 天然兼容带/不带连字符的多国邮编格式,匹配你处理多国邮编的需求
- 代码逻辑更简洁,比原始实现少了格式转换的冗余步骤
- 对示例输入直接测试,输出结果和需求完全一致
内容的提问来源于stack exchange,提问作者Tania
相关产品推荐
相关产品推荐

