You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:09:11