JS实现字符串数组拆分、区间值展开与重复值校验
JS数组范围展开与去重简洁实现
核心处理规则
- 原始数组先按逗号拆分所有项,自动去除每个值前后的空白字符
- 普通单值直接提取保留
- 范围格式自动展开连续序列,兼容两种写法:
- 简写范围:如
DL3-7展开为DL3,DL4,DL5,DL6,DL7 - 全写范围:如
DL3-DL7展开结果和简写一致
- 简写范围:如
- 自动拦截重复条目,无需额外写多层循环判断
实现代码
const originArr = [' DL1,C1,C5,C6','M4,DL3-7,B1-5'] /** * 展开单个范围值 * @param {string} val 待处理的单个值 * @returns {string[]} 展开后的值列表 */ function expandRangeItem(val) { const target = val.trim() // 正则匹配范围规则,捕获值前缀、起始数字、结束数字 const rangeMatch = target.match(/^([a-zA-Z]+)(\d+)-(?:[a-zA-Z]+)?(\d+)$/) // 非范围值直接返回 if (!rangeMatch) return [target] const [, prefix, startNum, endNum] = rangeMatch const sequence = [] for (let i = Number(startNum); i <= Number(endNum); i++) { sequence.push(`${prefix}${i}`) } return sequence } // 一行完成拆分、展开、去重全流程 const result = [...new Set( originArr.flatMap(str => str.split(',').flatMap(expandRangeItem)) )] // 输出结果和预期一致:['DL1','C1','C5','C6','M4','DL3','DL4','DL5','DL6','DL7','B1','B2','B3','B4','B5']
重复值处理说明
- 去重直接用ES6的
Set数据结构实现,插入值时天然自动去重,单值判断的时间复杂度为O(1),比手动写for循环遍历数组判断重复(时间复杂度O(n))效率高很多,代码也更简洁。 - 如果需要定位所有重复的条目,可以用如下逻辑快速统计:
// 统计所有值的出现次数 const countMap = {} originArr.flatMap(str => str.split(',').flatMap(expandRangeItem)).forEach(item => { countMap[item] = (countMap[item] || 0) + 1 }) // 过滤出出现次数大于1的重复值 const duplicateList = Object.entries(countMap) .filter(([_, count]) => count > 1) .map(([val]) => val)
内容的提问来源于stack exchange,提问作者ankit_dot
相关产品推荐
相关产品推荐

